第二章 内存寻址
本章介绍寻址技术。值得庆幸的是,操作系统自身不必完全了解物理内存;如今的微处理器包含的硬件线路
使内存管理既高效又健壮,所以编程错误就不会导致内存不正确的访问。
作为本书的一部分,本章将详细描述 80x86 微处理器怎样进行芯片级的内存寻址,Linux 又是如何利用寻址
硬件的。我们希望当你学习内存寻址技术在 Linux 最流行的硬件平台上的详细实现方法时,既能够更好地理
解分页单元的一般原理,又能更好地研究内存寻址技术在其他平台上是如何实现的。
关于内存管理有三章,这是其中的第一章;还有第八章,讨论内核怎样给自己分配主存;以及第九章,考
虑怎样给进程分配线性地址。
内存地址
程序员偶尔会引用内存地址
(memory address
)作为访问内存单元内容的一种方式,但是,当使用 80x86 微
处理器时,我们必须区分以下三种不同的地址:
逻辑地址(logical address)
包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址方式在 80x86 著名的分段结构
中表现得尤为具体,它促使 MS-DOS 或 windows 程序员把程序分成若干段。每一个逻辑地址都由一个
段
(segment)
和偏移量
(offset 或 displacement)
组成,偏移量指明了从段开始的地方到实际地址之间的距
离。
线性地址(linear address)( 也称虚拟地址virtual address)
是一个 32 位无符号整数,可以用来表示高达 4GB 的地址,也就是,高达 4 294 967 296 个存储器单元。
线性地址通常用 16 进制数字表示,值的范围从 0x00000000 到 0xffffffff。
物理地址(physical address)
用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。物理
地址由 32 位或 36 位无符号整数表示。
内存控制单元(MMU)通过一种称为
分段单元(segmentation unit)
的硬件电路把一个逻辑地址转换成线性
地址;接着,第二个称为
分页单元(paging unit)
的硬件电路把线性地址转换成一个物理地址(见图2-1)。