本章节介绍linux寻址技术,详细描述80x86微处理器怎样进行芯片级的内存寻址,linux又是如何寻址硬件的。
1. linux内存地址
80x86微处理器下主要有三种不同的地址:逻辑地址,线性地址,物理地址。
逻辑地址:
主要用于兼容早起80x86处理(段式内存管理方式),包含在机器语言指令中用来指定一个操作数或一条指令的地址。每个逻辑地址由一个段标识符(segment)和一个偏移量(offset)组成,偏移量指明从段开始到实际地址之间的距离。段标识符是一个16bits的字段,成为段选择符(segment selector),而偏移量是一个32bits的字段。
线性地址:
也叫虚拟地址,和逻辑地址一样不是一个真实的地址,如果逻辑地址对应段式内存管理方式下转换前的地址,那么线性地址就是页式内存管理方式下转换前的地址。在32位处理器上,它是一个32为无符号整型,用于寻址4G,也就是高达4294967296个内存单元。
物理内存:
是内存芯片级的单元寻址,与微处理器上的地址引脚发送到内存总线上的电信号相对应,也就是我们常说的真实物理地址。
CPU内存管理单元(MMU)将一个逻辑地址转换到物理地址需要两步:
(1).通过分段单元(segmentation unit)的硬件电路将逻辑地址转换成线性地址
(2).通过分页单元(paging unit)的硬件电路将线性地址转换成物理地址。
从80286开始,intel处理器以两种不同的方式进行地址转换:实时模式(real mode)和保护模式(protectd mode)。实时模式主要为兼容早起处理器。
在实时模式下,CPU直接寻址(物理地址),形式为:段值+偏移量。段值被保存在段寄存器中(如ds),并且段的长度被固定为64KB。段内偏移量被存放在任意一个可用于寻址的寄存器中(如si)。
在保护模式下,CPU可采用分段和分页机制,分段机制下使用的地址是逻辑地址,形式为:段选择子+段内偏移量。在分页机制下使用的地址是线性地址,形式为0x00000000。在保护模式下,段寄存器中存放的是一个段描述符表(segment Descriptor Table)中每个段在表中的索引值。
2. 内存分段机制
3. 内存分页机制
http://book.chinaunix.net/showart.php?id=1316