在Linux内核管理中,MMU的页表查询是最基础的知识,这里目的是通过理解页表查询过程,去厘清页表、页表项、页面、页面偏移量(也称页内偏移量)等概念及它们之间的关系,为Linux内核管理的学习与使用奠定基础。
接下来这里用最简单的一级页表查询过程来说明,理解了一级页表的查询过程,那么二级页表查询、三级页表查询也就能依次类推了。
前提条件:
以32位宽的处理器(虚拟地址和物理地址均是32位位宽)、页面大小4KB为前提讲解。
前提条件的分析:
1.寻址空间大小的由来:
由于是32位位宽,所以寻址空间大小是4GB,怎么计算来的呢?
32位—>则可以知道一共有2^32个地址,会有地址0x0000 0000、0x0000 0001、0x0000 0002…0xffff ffff,每个相邻地址间都只相差一个字节(1Byte),那是因为arm是以单个字节为单位寻址的,其他变量类型只是单个字节char类型的变种。所以2^32*1Byte = 4GB(地址个数 * 每个地址占1Byte大小 = 总的寻址空间大小),即寻址空间大小。
2.页面大小
前提条件里说页面大小4KB,这个其实是指物理页面大小,这个大小是由.s文件里设定的,也可以设定为16KB、64KB等等,一开始就设定了,设定好后,后面的页表大小才能确定,这里就以经典的4KB大小来说明。
一级页表查询
基于上述前提条件,一级页表查询过程如下图:<