页表自映射
注:本文仅针对32位、两级页表的系统。如X86
采用页表自映射方案的最终目的是,节省4KB的空间(对于32位,两级页表的系统来说)。
具体来说,如果不采用页表自映射方案,那么映射整个4GB的虚拟空间共需要
页表自映射的思想是,把所有的页表(4KB)放到连续的4MB 虚拟地址 空间中,并且要求这段空间4MB对齐,这样,会有一张页表的内容与页目录的内容完全相同,从而节省了页目录的空间。代价则是需要从虚拟地址空间中分配出连续的4MB对齐的4MB的空间。
用语言说实在太抽象了,下面上图。
上图中,页表和页目录都位于虚拟地址空间的连续内存中,换句话说,这4MB的页表可以对应到虚拟地址空间的一个Table Frame中。
我们采用上图中的术语描述所谓的自映射关系。
- 页表位于Table Frame x
- Table Frame x中的每个4KB大小的Page Frame 0-1023分别存储了页表的Table 0-1023
- 页目录的Entry 0-1023也需要分别指向页表的Table 0-1023。
- Table x 指向了 Table Frame x。(注意这里的x,是相同的x)
- Table x 中的页表项(Page Table Entry, PTE)0-1023,分别指向Table Frame x的1024个Page Frame(4KB),也就是Table 0-1023(根据第【2】条)。
- Table x 等价于页目录。页目录中的Entry x指向Table x。
这就被称为自映射,节省了页目录的4KB空间。
事实上,只要确定了页表所在的4MB空间的位置,就可以确定出页目录的地址。
例题
一个32位的虚拟存储系统有两级页表,其逻辑地址中,第22到31位是第一级页表,12位到21位是第二级页表,页内偏移占0到11位。一个进程的地址空间为4GB,如果从0x80000000开始映射4MB大小页表空间,请问第一级页表(页目录)所占4KB空间的起始地址?并说明理由。(注意B代表字节,一个32位地址占4字节)
题目中说映射4MB大小的页表空间,所以采用的是自映射方案。
页表4M空间起始地址为0x80000000,换算成Table Frame的编号,也就是
也就是说页表位于Table Frame 512,那么页目录则位于Table 512。
页目录的地址,也就是Table 512的地址为。
此外,我们还可以算出指向Table 512的页目录项Entry 512的地址(不重要)