操作系统的存储管理功能分为四个部分
- 地址映射
- 虚拟储存
- 内存分配
- 储存保护
一:地址映射
1. 固定地址映射
在编程或编译确定逻辑地址和物理地址的映射关系
特点:程序加载时必须放在指定的内存区域
容易产生地址冲突,运行失败
2. 静态地址映射
程序装入时由操作系统完成逻辑地址到物理地址的映射
MA = VA + BA
特点:程序运行之前确定映射关系,装入后不能移动,占用连续的内存空间
3. 动态地址映射
在程序执行过程中把逻辑地址转换为物理地址
MA = VA + BA
特点:程序占用的内存空间可动态变化,不要求连续的内存空间,便于多个进程共享代码,缺点是硬件支持(MMU),软件复杂
二:虚拟存储
借助辅存在逻辑上扩充内存,解决内存不足的问题
过程:
- 迁入:将要运行的部分装入内存
- 迁出:把不运行的部分暂时放在辅存
前提
短时间内进程不运行的部分往往占大部分
程序局部性原理
时间局部性
空间局部性
实现虚拟存储的前提:
足够的辅存
适当容量的内存
地址变换机构
三:内存分配
为程序分配足够的内存空间
Windows虚拟地址空间分配
在32位的机器上,地址空间从0x00000000~ 0xFFFFFFFF
,总大小为4GB。一般而言,低地址空间,从0x00000000~ 0x7FFFFFFF
使用户空间,高地址空间被分配给系统。
总体:
虚拟内存范围 | 功能 |
0x00000000 ~ 0x0000FFFF | 这段内存为空指针区,不可以同时访问 |
0x00010000 ~ 0x7FFEFFFF | 这段供进程使用,包括所有的数据,静态或动态加载的exe和dll模块,以及内存映射文件 |
0x7FFF0000 ~ 0x7FFFFFFF | 此64KB是禁止访问的,因为它挨着内核区域,防止内核区域被覆盖,以破坏内核的正确性和完整性,试图改写此区域,会产生异常,以阻拦进一步改写内存区域 |
0x80000000 ~ 0xFFFFFFFFF | 内核区域,用于线程调度,内存管理,文件系统支持,网络支持和所有设备驱动的代码全部在次分区加载,驻留在这个分区中的一切均可被所有进程共享 |
用户低2GB空间分配:
虚拟内存地址范围 | 功能 |
0x0 ~ 0xFFFF | 拒绝访问区域,用于帮助程序员避免引用错误的指针 |
0x00010000 ~ 0x7FFEFFFF | 专用进程地址空间 |
0x7EFDE000 ~ 0x7EFDEFFF | 用于第一个线程的线程环境块(TEB),系统会在这一页的前面创建附加的TEB(从0x7FFDD000开始向上) |
0x7FFDF000 ~ 0x7FFDFFFF | 进程环境块(PEB) |
0x7FFE0000 ~ 0x7FFE0FFF | 共享的用户数据页,这个只读方式的页面被映射到系统空间中包含系统时间,时钟计数和版本号信息的一个页面,这个页面的存在使数据在用户态下可以直接读取而不必请求核心态的转换 |
0x7FFE1000 ~ 0x7FFEFFFF | 拒绝访问区域 |
0x7FFF0000 ~ 0x7FFFFFFF | 拒绝访问区域,用于防止线程跨越用户/系统空间边界传送缓存区,在变量MmUserProbeAddress中包含此页的起始地址 |
核心高2GB空间分配:
虚拟内存地址范围 | 功能 |
0x80000000 ~ 0xc0000000 | 内核执行体,HAL和硬件驱动程序 |
0xc0000000 ~ 0xc0800000 | 进程页和超空间 |
0xc0800000 ~ 0xFFBE000 | 系统高速缓存,分页缓冲池,非分页缓冲池 |
0xFFBE000 ~ 0xFFC0000 | 崩溃储存驱动程序区域 |
0xFFC0000 ~ 0xFFFFFFF | 留给HAL使用 |
内存管理
每个进程都拥有自己的4G(32位机)虚拟内存地址,各个进程之间是相互独立的,每个进程的数据可由其中线程共享。虚拟内存地址本身不对应任何物理地址,直接引用会引发错误,虚拟内存地址必须映射物理地址后才能储存数据。内存分配其实指的是虚拟内存地址映射物理内存,内存回收就是指解除映射关系。
四:储存保护
保证在内存中的多道程序只能在给定的储存区域内活动并互不干扰
- 防止访问越界
- 防止访问越权
方法:界址寄存器
在CPU中设置一对下限寄存器和上限寄存器存放程序在内存中的下限地址和上限地址
程序访问内存时硬件自动将目的地址与下限寄存器和上限寄存器中存放的地址界限进行比较,判断是否越界
关于计算机硬件存储系统详细见计算机存储系统