MMU内存管理单元之二级页表

1. 二级页表

   如果使用页面映射的方式,段映射表就变成了一级映射表(First Level table,在linux内核中成为PGD),其表项提供的不再是物理段地址,而是二级页表的基地址。32bit虚拟地址的高12bit(bit[31:20])作为访问一级页表的索引值,找到相应的表项,每个表项指向一个二级页表。以虚拟地址的次8bit(bit[19:12])作为访问二级目录的索引值,得到相应的页表项,从这个页表项找到20位的物理页面地址。最后将这20bit的物理页面地址和虚拟地址的低12bit拼凑起来,得到最终的32bit物理地址。这个过程在ARM32架构中由MMU硬件完成,软件不需要介入;

1.1页表映射

1.1.1 不同分页的情况下,虚拟地址的拆分

在这里插入图片描述   根据1级描述符的低2bit,1级描述符可以代表4种不同的含义

1.1.2 粗细页表大小极小页映射图

在这里插入图片描述

1.1.3 粗页表与细页表

  粗页表只能以大页(64K)和小页(4K)为单位进行映射,而细页表除了能以大页和小页为单位进行映射之外,还可以以极小页(1K)为单位进行映射,假如配置Linux划分页表的最小映射单位为1K,那么就必须使用细页表,粗页表是做不到以1K为单位进行映射的

1.1.3.1 最小单位映射

粗页表和细页表的不同之处就是一条描述符所能映射的地址空间大小的能力,粗页表的一条描述符能够映射4K的物理地址空间,而细页表的一条描述符只能映射1K的物理地址空间,细页表也可以以小页和大页进行映射,假如细页表以小页(4K)进行映射,那么这条描述符所相邻的一共4条描述符均相同。

1.1.3.2 以1K为最小映射单元

如下图所示,只能以细页表进行映射,二级描述符的低两位为11,代表以1K极小页进行映射,映射范围为1K

在这里插入图片描述

1.1.3.3 以4K为最小映射单元

  这种情况粗页表和细页表均能完成,下图为粗页表完成映射的情况,一条描述符(第239条描述符)即可完成4K的映射
在这里插入图片描述
  下图为细页表完成4K映射的关系图,由于细页表的最小映射单位为1K,所以需要4条描述符(第1019-1022条)完成4K的映射,这四条描述符的内容相同,所以无论访问到4条描述符的哪一条,访问到的都是同一片4K物理地址区域
在这里插入图片描述

1.2 为何要用到二级页表?

  每个进程都有其自己的虚拟地址空间,对于32位虚拟地址来说,一级页表的确是需要4MB的内存来存储,而事实上,很少有需要4G内存的程序,很多地址其实进程是用不上的,这些地址就白白浪费。而多级页表的引进是避免把全部页表都保存到内存中去(就像一级页表那样),特别是那些程序没有用到的页表更是如此,二级页表是在进程的确需要更多内存的时候,才会分配更多的页表给当前进程,这样会更加有效率。而且每个进程都有自己独立的页表,如果每个进程都按需分配页表,相比一级页表的“全能”,总体看来,多级页表还是比较节省内存的

猜你喜欢

转载自blog.csdn.net/weixin_42314225/article/details/120049969