反向页表
一、页表
页表:又称页面映像表,存储在内存中,通过页表建立页(面)与物理块的索引。
二、页表项
页表项:在页表中,一个页号与其对应的物理块号称之为一个页表项(由已知条件知道大小是32位)。故页表项的数目就等于页(面)数目即为2^20个,全部页表项(页表中从上往下数)所需的地址也就是20位。
红框即为一个页表项,以此类推。
页表中的每一项都记录了这个页的基地址。通过页表,由逻辑地址的高位部分先找到逻辑地址对应的页基地址,再由页基地址偏移一定长度就得到最后的物理地址,偏移的长度由逻辑地址的低位部分决定。
三、二级页表
2的10次方=1024,也就是通过10bits可以直接定位在页表中哪个位置。
四、反向页表
一般意义上,每个进程都有一个相关页表。该进程所使用的每个页都在页表中有一项。
反向页表(inverted page table)每个真正的内存页或帧才有一个条目。每个条目包含保存在真正内存位置的页的虚拟地址以及拥有该页的进程的信息。因此,整个系统只有一个页表,对每个物理内存的页只有一条相应的条目。因为系统只有一个页表,而有多个地址空间映射物理内存,所以反向页表的条目中通常需要一个地址空间标识符,以确保一个特定进程的一个逻辑页可以映射到相应的物理帧。
让页表的空间大小和逻辑地址页号没有直接的关系,尽量和物理地址空间的页号建立映射关系,这么做的好处就是占用地址空间相对较少。
利用当前程序运行的进程号Pid 和CPU获取到的页表号(通过一个简单的hash函数)得到一个页帧号。
若没有hash,可能需要搜索整个表以查找匹配项。
下图没有使用hash:
由于反向页表按物理地址排序,而查找是根据虚拟地址,因此可能需要查找整个表来寻求匹配。这种查找会花费很长时间。为了解决这一问题,可以使用哈希页表来将查询限制在一个或少数几个页表条目。
下图为使用了hash:
反置页表不依据进程的逻辑页号来生成页表,而是依据进程在内存的物理页号来组织的,即一个系统中大多数情况下都只存在一个反向页表,通过逻辑页号+进程ID进行HASH,通过链接指针来得到对应的页架号(物理页号)。