聊一聊Linux虚拟内存技术
需要注意的是,页表是操作系统创建的用于内存管理的表格。因此,一个程序在运行时,其页表也要存放到内存空间。如果一个程序只需要一个页表,则不会有什么问题。但如果,程序的虚拟空间很大的话,就会出现一个比较大的问题。 比如:一个程序的虚拟空间为4GB,页表以4KB为一页,那么这个程序空间就是1M页。为了存储这1M页的页指针,那么这个页表的长度就相当大了,对内存的负担也很大了。所以,最好对页表也进行分页存储,在程序运行时只把需要的页复制到内存,而暂时不需要的页就让它留在辅存中。为了管理这些页表页,还要建立一个 记录页表页首地址的页目录表,于是单级页表就变成了二级页表。二级页表的地址转换如下图所示: 当然,如果程序的虚拟空间更大,那么也可以用三级页表来管理。为了具有通用性,Linux系统使用了三级页表结构:页目录(Page Directory,PGD)、中间页目录(Page Middle Directory,PMD)、页表(Page Table,PTE)。 Linux的页表结构 为了通用,Linux系统使用了三级页表结构:页目录、中间页目录和页表。PGD为 顶级页表,是一个pgdt数据类型的数组,每个数组元素指向一个中间页目录;PMD为 二级页表,是一个pmdt数据结构的数组,每个数组元素指向一个页表;PTE则是 页表,是一个pte_t数据类型的数组,每个元素中含有物理地址。 为了应用上的灵活,Linux使用一系列的宏来掩盖各种平台的细节。用户可以在配置文件 config中根据自己的需要对页表进行配置,以决定是使用三级页表还是使用二级页表。 在系统编译时,会根据配置文件 config中的配置,把目录 include/asm符号连接到具体CPU专用的文件目录中。例如,对于i386CPU,该目录符号会连接到include/asm-i386,并在文件pgable-2level-defs.h中定义了二级页表的基本结构,如下图: 其中还定义了:
在文件include/asm-i386/pgtable.h中定义了页目录和页表项的数据结构,如下:
从定义可知,它们都是只有一个 长整型类型(32位)的结构体。 注意:如上文的“页的保护”部分,页框码代表物理地址,只需要高20位就够了(因为页框的长度为4KB,因此页内偏移12位)。而后12位可以存放各个状态信息和访问权限。但是Linux并没有这样做,反而重新定义了一个结构体来存放,通过“或”运算来将两者结合。 【编辑推荐】
点赞 0 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |