参考链接:https://cloud.tencent.com/developer/article/1373361
https://blog.csdn.net/gatieme/article/details/50756050
https://blog.csdn.net/gatieme/article/details/50651561
Linux采用了一种同时适用于32位和64位系统的普通分页模式。4级分页模式
目前的内核的内存管理总是假定使用四级页表, 而不管底层处理器是否如此.
单元 |
描述 |
---|---|
页全局目录 |
Page GlobalDirectory |
页上级目录 |
Page Upper Directory |
页中间目录 |
Page Middle Directory |
页表 |
Page Table |
页内偏移 |
Page Offset |
对于没有启用物理地址扩展的32位系统,两级页表足够了。Linux通过使页上级目录和页中间目录位为0从根本上取消了页上级目录和中间目录。但是兼容扩展地址并64位系统下页能使用。
Linux不同于其他的操作系统, 它把计算机分成独立层(体系结构无关)/依赖层(体系结构相关)两个层次. 对于页面的映射和管理也是如此. 页表管理分为两个部分, 第一个部分依赖于体系结构, 第二个部分是体系结构无关的. 所有数据结构几乎都定义在特定体系结构的文件中. 这些数据结构的定义可以在头文件arch/对应体系/include/asm/page.h
和arch/
对应体系/include/asm/pgtable.h
中找到. 但是对于AMD64和IA-32已经统一为一个体系结构. 但是在处理页表方面仍然有很多的区别, 因为相关的定义分为两个不同的文件arch/x86/include/asm/page_32.h
和arch/x86/include/asm/page_64.h
, 类似的也有pgtable_xx.h .
2 页表
Linux内核通过四级页表将虚拟内存空间分为5个部分(4个页表项用于选择页, 1个索引用来表示页内的偏移). 各个体系结构不仅地址长度不同, 而且地址字拆分的方式也不一定相同. 因此内核使用了宏用于将地址分解为各个分量.
参考:深入理解Linux内核