这个问题思考的是程序与内存的映射问题? (请高手指教)
程序在编译以后,被分配到了一个4G的逻辑地址空间当中, 在这当中是以分区段的方式进行管理的(如有代码段,数据段,堆栈段等) 。
那么,如何将这4G的地址映射到真实的内存空间中?
cpu当中,有内存控制单元(硬件),这通过两次地址映射(第一次是分段单元,第二次是分页单元)将程序中的逻辑地址映射到真实的内容地址中。
那么,映射已经完成,如何找到自己所需的程序元器件运行程序呢?
这时,用到了全局描述符表和局部描述符表, 这两个表中存有各种段描述符(如代码段描述符,数据段描述符,任务状态段描述符等)。cpu通过这两个描述符表
能够找到所执行代码所在的内存位置和所需要的数据位置,从而进行运算和执行指令等操作。
80286只有段式内存管理机制,80386完善了段式内存管理且实现了页式内存管理。但是段式内存管理灵活性和效率都差。较好的方法是页式内存管理。本来页式内存管理不需
要建立在段式内存管理基础上。这是两种不同机制。但80386中,保护模式的实现是与段式存储密不可分的。所以,在利用已有资源,就不能绕过段式存储管理。因此,页式内
存管理建立在段式内存管理基础之上。这样,页式内存管理的作用是在段式内存管理所映射而成的地址上在加上一层地址映射。80286段式映射而成的地址就是“物理地址”,
80386段式映射以后的地址不再是“物理地址”,而是称为”线性地址“,线性地址再由页式内存管理映射成物理地址;或者不使用页式内存管理,就将线性地址世界用作物理地址
。
80386把线性地址空间划分成4k字节的页面,每个页面可以被映射到物理存储空间中任意一块4k字节大小的区间(边界必须是与4k字节对齐)。。段式内存管理中,连续的逻
辑地址映射后在线性地址空间还是连续的。但是,在页式内存管理中,连续的线性地址空间经过映射后在物理地址空间却不一定连续(其灵活性也正在于此)。一旦启用了页式
内存管理,所有的线性地址都要经过页式内存管理映射,连GDTR和LDTR中给出的段描述表起始地址也不例外。
cr3存放正在使用的页目录的物理地址,cr2存放缺页的线性地址,cr0最高位PG是页式映射机制的总开关,当被设置为1时,cpu开启页式内存管理的映射机制。