为什么使用多级页表?

对于32位处理器来说,32位的线性地址被分成三部分,如下图。其中,最低12位表示偏移量,中间的10位表示页表项,最高10位表示页目录项。由线性地址转换成物理地址经过两部,也就是所谓的二级页表。

32位线性地址寻址过程如下:

\

说明:控制寄存器cr3中存放了页目录的物理地址,通过cr3寄存器可以找到页目录,而线性地址中的Directory部分决定页目录中的目录项,而页目录项中存放了要找的页表的物理基地址,再结合线性地址中的中间10位(Page Table部分),就可以找到页框的物理地址。一个页框大小为4096字节,线性地址中的Offset部分占12位,因此页框的物理地址结合线性地址Offset部分就可以找到页框中的任何一个字节。

问题来了,为什么要用二级页表而不使用以及页表,或者说使用二级页表比一级页表的优势在哪里?

(1)使用多级页表可以是的页表在内存中离散存储。多级页表实际上是增加了索引,有了索引就可以定位到具体的项。举个例子:比如虚拟地址空间大小为4G,每个页大小依然为4K,如果使用一级页表的话,共有2^20个页表项,如果每一个页表项占4B,那么存放所有页表项需要4M,为了能够随机访问,那么就需要连续4M的内存空间来存放所有的页表项。随着虚拟地址空间的增大,存放页表所需要的连续空间也会增大,在操作系统内存紧张或者内存碎片较多时,这无疑会带来额外的开销。但是如果使用多级页表,我们可以使用一页来存放页目录项,页表项存放在内存中的其他位置,不用保证页目录项和页表项连续。

(2)使用多级页表可以节省页表内存。使用一级页表,需要连续的内存空间来存放所有的页表项。多级页表通过只为进程实际使用的那些虚拟地址内存区请求页表来减少内存使用量(出自《深入理解Linux内核》第三版51页)。举个例子:比如一个进程只是用4MB内存空间。对于以及页表,我们需要4M空间来存放页表,然后可以找到进程真正使用的4M内存空间。但是如果使用二级页表的话,一个页目录项可以定位4M内存空间,存放一个页目录项占4K,还需要一页用于存放进程使用的4M(4M=1024*4K,也就是用1024个页表项可以映射4M内存空间)内存空间对应的页表,总共需要4K+4K=8K来存放进程使用的这4M内存空间对应页表和页目录项,这比使用一级页表节省了很多内存空间。

那么使用多级页表比使用以及页表有没有什么劣势呢?

当然是有的。比如:使用以及页表时,读取内存中一页内容需要2次访问内存,第一次是访问页表项,第二次是访问要读取的一页数据。但如果是使用二级页表的话,就需要3次访问内存了,第一次访问页目录项,第二次访问页表项,第三次访问要读取的一页数据。访存次数的增加也就意味着访问数据所花费的总时间增加。

猜你喜欢

转载自blog.csdn.net/ibless/article/details/81275009