分类: LINUX
2008-10-14 08:38:42
本章介绍寻址技术。值得庆幸的是,操作系统自身不必完全了解物理内存;如今的微处理器包含的硬件线路使内存管理既高效又健壮,所以编程错误就不会对该程序之外的内存产生非法访问。
作为本书的一部分,本章将详细描述80x86微处理器怎样进行芯片级的内存寻址,Linux又是如何利用寻址硬件的。我们希望当你学习内存寻址技术在Linux 最流行的硬件平台上的详细实现方法时,既能够更好地理解分页单元的一般原理,又能更好地研究内存寻址技术在其他平台上是如何实现的。
关于内存管理有三章,这是其中的第一章;还有第八章,讨论内核怎样给自己分配主存;以及第九章,考虑怎样给进程分配线性地址。
程序员偶尔会引用内存地址(memory address)作为访问内存单元内容的一种方式,但是,当使用80x86 微处理器时,我们必须区分以下三种不同的地址:
*逻辑地址(logical address)
包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址方式在80x86著名的分段结构中表现得尤为具体,它促使MS-DOS 或Windows程序员把程序分成若干段。每一个逻辑地址都由一个段(segment)和偏移量(offset或 displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距离。
*线性地址(linear address)(也称虚拟地址 virtual address)
是一个32 位无符号整数,可以用来表示高达4GB的地址,也就是,高达4 294 967296 个内存单元。线性地址通常用十六进制数字表示,值的范围从0x00000000 到0xffffffff。
*物理地址(physical address)
用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。物理地址由32 位或36 位无符号整数表示。
内存控制单元(MMU)通过一种称为分段单元(segmentation unit)的硬件电路把一个逻辑地址转换成线性地址;接着,第二个称为分页单元(paging unit)的硬件电路把线性地址转换成一个物理地址(见图2-1)
在多处理器系统中,所有CPU都共享同一内存;这意味着RAM芯片可以由独立的CPU并发地访问。因为在RAM芯片上的读或写操作必须串行地执行,因此一种所谓内存仲裁器(memory arbiter)的硬件电路插在总线和每个RAM 芯片之间。其作用是如果某个RAM芯片空闲,就准予一个CPU 访问,如果该芯片忙于为另一个处理器提出的请求服务,就延迟这个CPU的访问。即使在单处理器上也使用内存仲裁器,因为单处理器系统中包含一个叫做DMA控制器的特殊处理器,而DMA 控制器与CPU 并发操作[参见第十三章“直接内存访问(DMA)”一节”]。在多处理器系统的情况下,因为仲裁器有多个输入端口,所以其结构更加复杂。例如,双Pentium 在每个芯片的入口维持一个两端口仲裁器,并在试图使用公用总线前请求两个CPU交换同步信息。从编程观点看,因为仲裁器由硬件电路管理,因此它是隐藏的。