linux内存管理(四)——地址转换
物理地址:CPU通过地址总线的寻址,找到真实的物理内存对应地址。就是真实的内存地址。
逻辑地址:程序代码经过编译后出现在汇编程序中地址,算是进程当中用到的地址吧。
线性地址(虚拟地址):就是上面的逻辑地址计算而来的地址,本质还是进程当中使用的虚拟地址。在32位CPU架构下,可以表示4G的地址空间,用16进制表示就是0x00000000---0Xffff ffff 。
- 线性地址页:从管理和效率的角度出发,线性地址被分为固定长度的组,称为页(page)。例如32位机器,线性地址最大可为4G,如果用4KB为页容量,这样将线性地址划分为2^20个页。
-
物理页:另一类“页”,称为“物理页”,或者是“页框、页帧”。分页单元把所有的物理内存也划分为固定长度的管理单位,它的长度一般与线性地址页是相同
页式管理的具体流程:
说明:
1、 分页单元中,页目录的地址放在CPU的CR3寄存器中,是进行地址转换的起始点。
2、 每个进程,都有其独立的虚拟地址空间,运行一个进程,首先需要将它的页目录地址放到CR3寄存器中,将其他进程保存下来。
3、 每一个32位的线性地址被划分三部分:页目录索引(10位):页表索引(10位):偏移(12位)
下面是地址转换的步骤:
第一步:装入进程的页目录地址(操作系统在调度进程时,把这个地址装入CR3)
第二步:根据线性地址前十位,在页目录中,找到对应的索引项 即页表地址。
第三步:根据线性地址中间十位,在页表中,找到对应的索引项 即页的起始地址。
第四步:将页的起始地址与线性地址最后12位相加,等到物理地址。\