1.1 页框和页帧
我们知道通过页表可以将虚拟内存映射到对应的物理内存,而操作系统对于物理内存的管理并不是以字节为单位的,而是将物理内存分为许多大小为4KB的块,称为页框或页帧,这就是为什么我们在创建共享内存是建议将大小设定为4096字节的整数倍,而4KB也是操作系统与磁盘交互的基本单位(8个扇区),对于文件来说,文件的内容被存放在磁盘的大小为4KB的块中(Data Block),所以在进行磁盘级的IO操作时,就是将磁盘中的4KB的数据块加载到物理内存对应的页框中。
而由于物理内存中存在许多的4KB块,OS为了管理好物理内存,需要知道每个块的使用情况,用名字为struct page结构体对每个块进行了描述,这样只需要一个struct page类型的数组就可以管理整个物理内存了。
1.2 页表的映射
目前我们对页表的知识是有欠缺的,以32位机器为例,每一个字节的物理内存都需要虚拟内存与之对应,一个地址空间仅仅虚拟内存就占了2的32次方字节的大小,也就是4GB,所以页表的映射关系并没有这么简单。
一个虚拟地址有32个比特位,OS将这32个比特位分为了10位、10位、12位,在每个进程中存在一张页表目录,该目录保存着2的10次方张页表,而前10位就是用来索引页表目录来找到对应的页表的,页表中存放的是对应页框的起始地址。2的12次方正好是4KB对应着一个页框的大小,最后12位是该虚拟内存在页框中的地址偏移量,所以虚拟地址的前10位用于索引页表,中间10位用于索引页框的地址,最后的12位就可以锁定具体的物理地址了。64位机器的原理和上述一样
接下来我们大概计算一下按上述说法一个进程的页表需要多大的内存,页目录1024*4也就是4Kb,页表中索引的是页框的地址,一个地址空间对应的物理内存有2的20次方个页框,所以只需要20个字节就可以索引到所有的页框,那么页表的每个元素只需要3个字节接可以了,一个页表需要3*1024个字节,一共有1024个页表,所以一共需要的大小为4KB+3M的大小(上述大小是大概计算的并不准确)