《LINUX内存地址.》.pdf
文本预览下载声明
第二章 内存寻址
本章介绍寻址技术。值得庆幸的是,操作系统自身不必完全了 物理内存;如今的微处理器包含的硬件线路
使内存管理既高效又健壮,所以编程错误就不会导致内存不正确的访问。
作为本书的一部分,本章将详细描述80x86 微处理器怎样进行芯片级的内存寻址,Linux 又是如何利用寻址
硬件的。我们希望当你学习内存寻址技术在Linux 最流行的硬件平台上的详细实现方法时,既能够更好地理
分页单元的一般原理,又能更好地研究内存寻址技术在其他平台上是如何实现的。
关于内存管理有三章,这是其中的第一章;还有第八章,讨论内核怎样给自己分配主存;以及第九章,考
虑怎样给进程分配线性地址。
内存地址
程序员偶尔会引用内存地址 (memory address )作为访问内存单元内容的一种方式,但是,当使用80x86 微
处理器时,我们必须区分以下三种不同的地址:
逻辑地址 (logical address )
包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址方式在80x86 著名的分段结构
中表现得尤为具体,它促使MSDOS 或windows 程序员把程序分成若干段。每一个逻辑地址都由一个段
(segment)和偏移量 (off set 或disp lacement)组成,偏移量指明了从段开始的地方到实际地址之间的距
离。
线性地址 (linear address )(也称虚拟地址virtual address)
是一个32 位无符号整数,可以用来表示高达4GB 的地址,也就是,高达4 294 967 296 个存储器单元。
线性地址通常用16 进制数字表示,值的范围从0到0xffffffff 。
物理地址 (p hy sical address )
用于内存芯片级内存单元寻址。它们与从微处理器的地址引脚发送到内存总线上的电信号相对应。物理
地址由32 位或36 位无符号整数表示。
内存控制单元 (MMU)通过一种称为分段单元 (segmentation unit)的硬件电路把一个逻辑地址转换成线性
地址;接着,第二个称为分页单元 (paging unit)的硬件电路把线性地址转换成一个物理地址 (见图21)。
图21:逻辑地址转换
在多处理机系统中,所有CPU 都共享同一内存;这意味着RAM 芯片可以由独立的CPU 并发地访问。因为在
RAM 芯片上的读或写操作必须串行地执行,因此一种所谓内存仲裁器 (memory arbiter)的硬件电路插入
在总线和每个RAM 芯片之间。其作用是如果某个RAM 芯片空闲,就准予一个CPU 访问,如果该芯片忙于为
另一个处理器提出的请求服务,就延迟这个CPU 的访问。即使在单处理器上也使用存储器仲裁器,因为单处
理器系统中包含一个叫做DMA 的特殊处理器,而DMA 与CPU 并发操作 (参见第十三章“直接存储器访问
(DMA)”一节“)。在多处理器系统的 况下,因为仲裁器有多个输入端口,所以其结构更加复杂。例如,
双Pentium 在每个芯片的入口维持一个两端口仲裁器,并在试图使用公用总线前请求两个CPU 交换同步信
息。从编程观点看,因为仲裁器由硬件电路管理,因此它是隐藏的。
硬件中的分段
从80286模式开始,Intel微处理器以两种不同的方式执行地址转换,这两种方式分别称为实模式(real mode)
和保护模式(protected mode) 。我们将从下一节开始描述保护模式下的地址转换。实模式存在的主要原因是要
维持处理器与早期模型兼容,并让操作系统自举(参阅附录一中针对实模式的简短描述) 。
段选择符和段寄存器
一个逻辑地址由两部分组成:一个段标识符和一个指定段内相对地址的偏移量。段标识符是一个16位长的字
段,称为段选择符(segment selector 见图22) ,而偏移量是一个32位长的字段。我们将在本章“快速访问段描
述符”一节描述断选择符字段。
图22:段描述符格式
为了快速方便地找到段选择符,处理器提供段寄存器,段寄存器的唯一目的是存放段选择符。这些段寄存器
称为cs ,ss ,ds ,es ,fs 和gs 。尽管只有6 个段寄存器,但程序可以把同一个段寄存器用于不同的目的,
方法是先将其值保存在存储器中,用完后再恢复。
6 个寄存器中3 个有专门的用途:
cs
代码段寄存器,指向包含程序指令的段。
ss
栈段寄存器,指向包含当前程序栈的段。
ds
数据段寄存器,指向包含静态数据或者全局数据的段。
其它三个段
显示全部