MMU(Memory Management Unit)是一种硬件设备,用于处理CPU访问内存时的地址转换。在MMU的帮助下,操作系统能够实现虚拟内存。在虚拟内存中,每个进程都拥有自己独立的地址空间,且无需关注实际物理内存的位置。因此,MMU需要能够将虚拟地址转换为实际的物理地址。这一过程需要涉及到多级页表,而1M描述符是其中的一级。
在物理内存被划分为若干个物理内存页时,底层的硬件支持不同大小的页。不同的物理内存页大小影响着MMU地址转换时需要建立的页表项数,也就是影响着页表的大小。而MMU需要将整个物理内存空间均分成若干个虚拟内存页,例如x86-32中的页大小为4k,而MMU必须保证这些页被正确地映射到相应的物理地址上。
对于一个物理地址,需要通过一级页表项的地址来进行合法性检查,以检查该地址是否可以被访问。而一级页表项与四级页表项有所不同,它并不是储存在内存中的。在Linux内核中,一级页表项被嵌入到了页表目录中,也就是说,页表包含了1024个32位的一级页表项。这些页表项可以通过指针来寻址,其中一个指针指向整个页表。
在一级页表项中,每个描述符的大小为4字节。因此,使用1MB的描述符可以处理256K的物理内存。最初,这可能足够了,但是随着计算机内存容量的增加,需要处理的内存也在不断增加,这就导致了原来的1M描述符不够用了。
为了解决这个问题,一种可能的解决方法是增加描述符的大小。然而,这样会导致需要建立更大的页,这会使得一些内存无法高效利用。因此,在物理内存页大小不变的情况下,16k大小的一页是一个比较好的折衷方案。这种大小的页可以很好地平衡空间和时间的需求。
为了增加地址转换操作的速度,在32位系统中,使用了两级页表,即1级页表描述2MB的物理内存,2级页表描述4KB的虚拟内存,这样映射4GB的虚拟内存将需要描述符4个,1级页表目录需要1024个指针(共1024项),2级页表目录需要1024*1024个指针(共1048576项)。
16k的大小既能让1级描述符易于实现,又可以使得描述符的数量控制在适当范围内,同时也可以提高访问效率。使用这种方案,可以很好地平衡储存空间和访问效率的需求。