Linux 内存管理导读
1. 存储层次结构和 x86 存储管理硬件(MMU)
1.1 存储层次
高速缓存(cache) à 主存(main memory) à 磁盘(disk)
理解存储层次结构的根源:CPU 速度和存储器速度的差距。
层次结构可行的原因:局部性原理。
LINUX 的任务:
l 减小 footprint,提高 cache 命中率,充分利用局部性。
l 实现虚拟存储以满足进程的需求,有效地管理内存分配,力求最合理地利
用有限的资源。
1.2 MMU的作用
辅助操作系统进行内存管理,提供虚实地址转换等硬件支持。
1.3 x86 的地址
逻辑地址:出现在机器指令中,用来制定操作数的地址。段:偏移
线性地址:逻辑地址经过分段单元处理后(如将段地址左移四位与偏移量)得到线性
地址,这是一个 32 位的无符号整数,可用于定位 4G 个存储单元。
物理地址:线性地址经过页表查找后得出物理地址,这个地址将被送到地址总线上指
示所要访问的物理内存单元。
LINUX: 尽量避免使用段功能以提高可移植性。如通过使用基址为 0 的段,
使逻辑地址==线性地址。
1.4 x86 的段与 Linux 下的段比较
x86 保护模式下的段:表索引+描述符项。不仅仅是一个基地址的原因是为了提供更
多的信息:保护、长度限制、类型等。描述符项存放在一张表中(GDT 或 LDT),表
索引就是表的索引。段寄存器中存放的是表索引,在段寄存器装入的同时,描述符中
的数据被装入一个不可见的寄存器以便 cpu 快速访问。
专用寄存器:GDTR(包含全局描述附表的首地址),
LDTR(当前进程的段描述附表首地址),
TSR(指向当前进程的任务状态段)
LINUX 使用的四种段:
__KERNEL_CS: 内核代码段。范围 0-4G。可读、执行。DPL=0。
__KERNEL_DS:内核代码段。范围 0-4G。可读、写。DPL=0。
__USER_CS:内核代码段。范围 0-4G。可读、执行。DPL=3。
__USER_DS:内核代码段。范围 0-4G。可读、写。DPL=3。
TSS(任务状态段):存储进程的硬件上下文,进程切换时使用。( 因为 x86 硬件对
TSS 有一定支持,所有有这个特殊的段和相应的专用寄存器。)
__USER_CS 和__USER_DS 段都是被所有在用户态下的进程共享的。但这种段
的共享和进程空间的共享是有区别的:虽然各个进程使用同一个(种)段,但通过使