分段机制将逻辑地址转换成线性地址后,还需要借助分页机制,将线性地址转换为物理地址;
内存分页管理机制的基本原理是将整个线性内存区域划分成4KB为单位的内存页面;
32位处理器可以支持的寻址空间为2^32 =4GB,以4KB作为一个页,称为page或者page frame(页框);
那么4GB的空间,总共就有4G/4K =1M个页面,每个页面属性需要4字节,整个页表所占空间就需要4MB;
访问物理内存前,首先要通过页表找到线性地址对应的物理地址,因此页表需要常驻内存,这样比较耗费
内存空间,尤其是对于内存资源紧张的嵌入式系统;因此将一级页表分成了两级页表,可理解为二维数组;
第一级页表称为页目录(page directory),每个元素代表一个页表(page table entry),每个元素4字节,总共1K个页表项,
占用一个page(4*1K);
每个页表也是由1K个页面属性构成,每个页面属性4字节,页面属性里面包含了页面的物理地址以及页面的属性信息;
线性地址转换过程:
第一级的页表,常驻内存,占1个page;32位线性地址,高10位(即位31~位22)用来表示一维数组的索引;计算之后获得第二级页表;再利用32位线性地址的中间10位(即位21~位12),获取二级页表具体某项页面属性;
该页面属性中即含有页面对应的物理地址的起始地址paddress;32位线性地址的最后12位代表了物理页面的偏移值offset,
paddress+offset 即可得到最终的物理地址;
内存分页管理机制的基本原理是将整个线性内存区域划分成4KB为单位的内存页面;
32位处理器可以支持的寻址空间为2^32 =4GB,以4KB作为一个页,称为page或者page frame(页框);
那么4GB的空间,总共就有4G/4K =1M个页面,每个页面属性需要4字节,整个页表所占空间就需要4MB;
访问物理内存前,首先要通过页表找到线性地址对应的物理地址,因此页表需要常驻内存,这样比较耗费
内存空间,尤其是对于内存资源紧张的嵌入式系统;因此将一级页表分成了两级页表,可理解为二维数组;
第一级页表称为页目录(page directory),每个元素代表一个页表(page table entry),每个元素4字节,总共1K个页表项,
占用一个page(4*1K);
每个页表也是由1K个页面属性构成,每个页面属性4字节,页面属性里面包含了页面的物理地址以及页面的属性信息;
两级页表结构总共就有1K*1K=1M个页面,可定义为PT[a][b],a=b=2^10;
页目录项
页面项
80386的每个页目录项指向一个页表,页表最多含有1024个页面项,每项4个字节,包含页面的起始地址和有关该页面的信息。页面的起始地址也是4K的整数倍,所以页面的低12位也留作它用。
第31~12位是20位物理页面地址,除第6位外第0~5位及9~11位的用途和页目录项一样,第6位是页面项独有的,当对涉及的页面进行写操作时,D位被置1。
4GB的内存只有一个页目录,它最多有1024个页目录项,每个页目录项又含有1024个页面项,因此,内存一共可以分成1024×1024=1M个页面。由于每个页面为4K个字节,所以,存储器的大小正好最多为4GB。
线性地址转换过程:
第一级的页表,常驻内存,占1个page;32位线性地址,高10位(即位31~位22)用来表示一维数组的索引;计算之后获得第二级页表;再利用32位线性地址的中间10位(即位21~位12),获取二级页表具体某项页面属性;
该页面属性中即含有页面对应的物理地址的起始地址paddress;32位线性地址的最后12位代表了物理页面的偏移值offset,
paddress+offset 即可得到最终的物理地址;
过程如图:
为了支持64位系统的分页管理,linux采用了统一的分页管理模型:
- 页全局目录
- 页顶级目录
- 页中间目录
- 页表
32位系统中可以将页顶级目录跟页中间目录置为0, 这样实际使用的就是二级页表;
64位系统可以根据需要采用三级或者四级页表管理;