2011年(17)
分类: Delphi
2011-09-28 15:43:32
在保护模式下,分段将逻辑地址转换到线性地址,而分页则将线性地址转换到最终的物理地址。通过cr0的pg标志可以启用分页。
页和页框为了效率起见,线性地址被分成以固定长度为单位的组,称为页,在同一个页内部连续的线性地址所对应的物理地址也是连续的。分页单元将所有的RAM分成固定长度的页框,页和页框的大小完全一致。页是一段数据,而将这段数据置于物理存储中,这个整体存在就是页框。页是一个数据段而页框是主存的一部分,页可以放置到页框中。
线性地址和页目录、页表32位的线性地址分为三个域:最高十位是页目录,中间十位是页表,最后十位是在页表中的偏移。
图3
线性地址到物理地址的变换是基于两个转换表的,分别是页目录表和页表。当前正在使用的页目录的地址放在cr3中,而线性地址的前十位正是指定页目录中的目录项,每个目录项中指定一个页表,而线性地址的中间十位则是页表中的表项。这个表项中就有该页所在页框的物理地址,再加上最后的偏移值,就完成了从线性地址到物理地址的转换。
物理地址扩展和页目录指针为了扩大内存寻址的能力,对4G以上的内存寻址,Intel将处理器上的管脚数目提高到了36个,为了充分的支持这36和管脚,Intel设计的物理地址扩展(PAE)机制。通过cr4寄存器的PAE标志可以启用物理地址扩展。
而PAE机制的使用则会改变线性地址的解析方式,其中最重要的就是一种称为页目录指针PDPT的结构的引入。
页目录指针是一个新的转换表级别,它有四个表项。cr3此时指向这样一个PDPT。
在把线性地址映射到一个4k的页时,转换的过程如下:
线性地址的最高10位指向PDPT四个表项中的一个,次高10位指向页目录512个项中的一个,再低10位指向页表中512个项中的一个,最后的10位则指向页框中的偏移地址。
而把线性地址映射到一个1m的页式,则去掉了页表这个转换表,直接在512个页目录的某项上用20位的偏移地址。
分页物理地址和转换后援缓冲器这种基于转换表的线性地址到物理地址的变化同样降低了效率,因此Intel引入了转换后援缓冲器(TLB)。它将已经使用的线性地址到物理地址的转换记录下来,以供快速使用,只有当cr3中的内容改变时,TLB的内容才会被重新填充。
参考书籍
《深入理解Linux内核》第三版