在x86 32位平台上真正起作用的是页式映射,介绍页式映射的时候首先要记住四点:
1 cpu的mmu单元只认物理地址
2 每个进程有自己的一份叶目录表(pgd)
3 pgd pmd pt都是放在操作系统的进程空间(3g-4g虚拟地址)
4 内核使用的3g-4g内存与物理内存的关系基本上属于线性映射,内核使用的物理第一与物理地址有固定的差值,而pgd,pmd,pt都是放在内核空间,由内核填写表项中的物理地址,mmu单元进行转换
明白了上述四点之后来看一下是如何映射的, 第一点要说明的是32位操作系统如何把软件上的三层映射结构准换为2层
页面映射在32位x86系统上是如上过程,但是为了适应更大的内存,更多情况软件上设置了三层结构
pgd,pmd,pt,pmd到pt的过程如上图pgd到pt一样,只不过加了一层pgd到pmd的过程,映射过程也是一样的,但是在二层映射的硬件上,
pmd只有一个表项,是和pgd重合的,所以就绕过了pmd。
现在解释下如上映射过程
cr3寄存器中存放的是进程pgd的物理地址,在进程切换的时候由内核设置好该寄存器的内容,ip寄存器则存放的是mmu单元要进行映射的虚拟地址。mmu单元会把虚拟地址准成三部分。寻址过程如下
1 取cr3物理地址找到存放在物理地址中的pgd页目录表
2 取虚拟地址中最高10位作为pgd目录索引,找到pgd中存放的pt页表物理地址
3 区虚拟地址中12-21位作为pt索引找到pt中的表象
4根据pte中的表项找到虚拟地址所对应的物理页面(取高20位左移12位)
5 取虚拟地址中后12位(4k空间)作为物理页面偏移找到虚拟地址所对应的物理地址
对于pgd pt中的表项内容总结
1 pgd表项中存放的是32位物理地址
2 pt表项存放的为32位数据结构,前20位作为物理地址,后12位记录页面状态