虚拟地址空间的分区
分区 | 区间 |
---|---|
空指针赋值区 | 0x00000000~0x0000FFFF |
用户可使用的分区 | 0x00010000~0x7FFEFFFF |
64KB禁入分区 | 0x7FFF0000~0x7FFFFFFF |
内核分区 | 0x80000000~0xFFFFFFFF |
物理存储器和虚拟地址之间的映射方向
需要先明确一点: 系统是把物理存储器 映射到 一个虚拟地址,而不是把虚拟地址映射到一个物理存储器
相关名词
- 预定: 表示用户程序将要使用某一块虚拟地址空间
- 调拨: 将一块物理存储空间映射到这块虚拟地址
页交换文件
- 很多时候,我们觉得一个程序可用的内存总量取决于物理内存的大小。
实际并不是这样,一个程序的可用内存大小取决于 页交换文件的大小。
虽然有些难以理解,但是,物理存储器可以看作时页交换文件中的一部分。 - 每一块物理内存都有对应的页交换文件,虚拟内存其实是虚拟地址空间和页交换文件的映射
- 当系统释放一页物理内存的时候,如果这一页物理内存没有被修改过,我们是可以直接释放的
- 操作系统维护了每一个进程的虚拟地址对应的物理内存地址或是对应的页交换文件的地址
程序的加载
当系统加载一个程序时,程序的指令和数据并不是直接就加载到内存中的,而是经过页交换文件,也就是说,每一个程序都会被加载到页交换文件中。
内存映像文件
- 为什么一个.exe文件被叫做内存映像文件?
当系统加载一个exe文件的时候,原始的exe文件会被用来充当页交换文件,而页交换文件可以被看作是内存。
页面属性
- 一共有8个页面属性,这里只介绍PAGE_WRITECOPY这个属性,当一个页面处于PAGE_WRITECOPY属性时,程序对这个页面进行写入操作时,会先复制一份该页面的副本,并将数据写入副本中.
物理存储器
- 内存,页交换文件,可执行文件都是物理存储器
- 同时,我们往预定区域映射的就是物理存储器,注意一般不会直接映射到
地址空间中的各种区域
区域的类型
- Free 未预定的状态
- Mapped 使用内存映射到这个区域
- Private 使用页交换文件映射到这个区域
- Image 使用镜像文件映射到这个区域
区域的基地址
- 所有区域都有一个基地址和大小
分页内存和非分页内存
- 当访问的内存地址空间不在物理内存上时,会产生缺页中断
- 中断是有优先级之分的
- 在一个高优先级得中断处理函数中, 低优先级的中断是无法产生的,
所以在一些情况下,却也中断可能无法产生,导致一些中断处理程序无法访问想要访问的内存 - 结论: 在高优先级的中断处理函数中,不应该使用分页内存,而是要使用非分页内存
- 通过下面的代码来指定分页内存和非分页内存
#define PAGEDCODE code_seg("PAGE"); // 分页内存,可以交换到文件中
#define LOCKEDCODE code_seg(); // 非分页内存,禁止交换到文件中
#define INITCODE code_seg("INIT"); // 初始化的时候载入内存,然后可以从内存中卸载掉
#define PAGEDDATA data_seg("PAGE");
#define LOCKEDDATA data_seg();
#define INITDATA data_seg("INIT");