线性地址是一个32位
无符号整数,可以用来表示高达4GB的地址,也就是,高达4294967296个内存单元。线性地址通常用十六进制数字表示,值的范围从0x00000000到0xffffffff。程序代码会产生
逻辑地址,通过逻辑地址变换就可以生成一个线性地址。如果启用了分页机制,那么线性地址可以再经过变换以产生一个
物理地址。当采用4KB分页大小的时候,线性地址的高10位为页目录项在页目录表中的编号,中间10位为
页表中的页号,其低12位则为
偏移地址。如果是使用4MB
分页机制,则高10位页号,低22位为
偏移地址。如果没有启用分页机制,那么线性地址直接就是
物理地址。
CPU的页式
内存管理单元,负责把一个线性地址,最终翻译为一个
物理地址。从管理和效率的角度出发,线性地址被分为以固定长度为单位的组,称为页(page),例如一个32位的机器,线性地址最大可为4G,可以用4KB为一个页来划分,这页,整个线性地址就被划分为一个tatol_page[2^20]的大数组,共有2的20个次方个页。这个大数组我们称之为页目录。目录中的每一个目录项,就是一个地址——对应的页的地址。
1、分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中,是进行
地址转换的开始点。万里长征就从此长始了。
2、每一个活动的进程,因为都有其独立的对应的虚似内存(页目录也是唯一的),那么它也对应了一个独立的页目录地址。——运行一个进程,需要将它的页目录地址放到cr3寄存器中,将别个的保存下来。
3、每一个32位的线性地址被划分为三部份,面目录索引(10位):
页表索引(10位):偏移(12位)
2、根据线性地址前十位,在
数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个
页表的地址。(又引入了一个
数组),页的地址被放到
页表中去了。