Linux 内核学习笔记系列,内存管理部分,简单介绍内存寻址。
简介
这部分内容和体系结构密切相关,而且涉及了大量过时的内容,我对这一块内容的兴趣也不大,所以这里只对 Intel x86 体系结构做很简单的介绍。
更多资料建议参考 Intel 官方文档和 AMD 官方文档。
分段内存模式
以下内容仅针对 Intel x86_32 体系结构。
逻辑地址
逻辑地址(logical address)由一个段(segment)和偏移量(offset 或 displacement)组成。
线性地址(虚拟地址)
线性地址(linear address)也被称作虚拟地址(virtual address),是 32
位的无符号整数。
物理地址
用于内存芯片级内存单元寻址。
地址间的关系
|
|
再次强调,线性地址就是虚拟地址,这两者是完全等价的。
平坦内存模式
在 x86_64 体系结构中,分段被禁用了,内存是平坦的。
线性地址是 48
位的。
尽管 x86_64 理论上可以支持 64
位的线性地址,但目前 48
位已经足够使用了,所以处理器硬件通常也只提供了 48
条地址线。
分段
现在是 64 位处理器的时代,分段基本被废弃了,这里只给出几个参考资料:
相关的代码我准备放到系统启动部分一起介绍,见 TODO。
分页
对于 32 位系统,两级页表已经足够了;而对于 64 位系统,往往需要更多的分页级别。
Linux 采用了四级分页模型,如下图所示:
相关的宏和函数基本位于 arch/x86/include/asm/pgtable.h
,大部分看名字就能猜测出功能,实现也比较简单,这里不准备展开了。