【笔记】C_内存分页机制

学习资料来自于http://c.biancheng.net/

1.虚拟内存对应物理地址

虚拟地址与物理地址一一对应。
【笔记】C_内存分页机制
将地址以212=4K大小分页,即加入4GB的虚拟内存=220 *212 ,即220 页。

2.一级页表

把所有的页整合成为一个数组,即这个数组有220 个元素,每个元素对应物理地址的相应页地址,每个元素占4字节,即页表大小4MB。
那么物理地址=物理页地址+偏移值。
所以虚拟地址=20的数组下标+12的偏移地址
【笔记】C_内存分页机制

为什么要这样切割呢?因为页表数组共有 2^20 = 1M 个元素,使用虚拟地址的高20位作为下标,正好能够访问数组中的所有元素;并且,一个页面的大小为 2^12 = 4KB,使用虚拟地址的低12位恰好能够表示所有偏移。

每个元素拥有32位,用高20位映射对应的物理地址的页,另外12位定义页的相关属性。

例如一个虚拟地址 0XA010BA01,它的高20位是 0XA010B,所以需要访问页表数组的第 0XA010B 个元素,才能找到数据所在的物理页面。假设页表数组第 0XA010B 个元素的值为 0X0F70AAA0,它的高20位为 0X0F70A,那么就可以确定数据位于第 0X0F70A 个物理页面。再来看虚拟地址,它的低12位是 0XA01,所以页内偏移也是 0XA01。有了页面索引和页内偏移,就可以算出物理地址了。经过计算,最终的物理地址为 0X0F70A * 2^12 + 0XA01 = 0X0F70A000 + 0XA01 = 0X0F70AA01。
【笔记】C_内存分页机制

3.两级页表

将220 页分割成210 *210 ,若将其分成1024个页表目录,每个页表目录中含有1024个页表。
【笔记】C_内存分页机制
即虚拟地址高10位在一个1024个元素的数组中查找页目录,找到这个页目录即一个1024个元素,中间10位在查找到相关页,再加上偏移地址得出物理地址。
【笔记】C_内存分页机制
例如一个虚拟地址 0011000101 1010001100 111100001010,它的高10位为 0011000101,对应页目录中的第 0011000101 个元素,假设该元素的高20位为 0XF012A,也即对应的页表在物理内存中的编号为 0XF012A,这样就找到了页表。虚拟地址中间10位为 1010001100,它对应页表中的第 1010001100 个元素,假设该元素的高20位为 0X00D20,也即物理页的索引为 0X00D20。通过计算,最终的物理地址为 0X00D20 * 2^12 + 111100001010 = 0X00D20F0A。