文档详情

《LINUX内存地址.》.pdf

发布:2016-01-03约4.33万字共40页下载文档
文本预览下载声明
第二章 内存寻址 本章介绍寻址技术。值得庆幸的是,操作系统自身不必完全了 物理内存;如今的微处理器包含的硬件线路 使内存管理既高效又健壮,所以编程错误就不会导致内存不正确的访问。 作为本书的一部分,本章将详细描述80x86 微处理器怎样进行芯片级的内存寻址,Linux 又是如何利用寻址 硬件的。我们希望当你学习内存寻址技术在Linux 最流行的硬件平台上的详细实现方法时,既能够更好地理 分页单元的一般原理,又能更好地研究内存寻址技术在其他平台上是如何实现的。 关于内存管理有三章,这是其中的第一章;还有第八章,讨论内核怎样给自己分配主存;以及第九章,考 虑怎样给进程分配线性地址。 内存地址 程序员偶尔会引用内存地址 (memory address )作为访问内存单元内容的一种方式,但是,当使用80x86 微 处理器时,我们必须区分以下三种不同的地址: 逻辑地址 (logical address ) 包含在机器语言指令中用来指定一个操作数或一条指令的地址。这种寻址方式在80x86 著名的分段结构 中表现得尤为具体,它促使MS­DOS 或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)的硬件电路把线性地址转换成一个物理地址 (见图2­1)。 图2­1:逻辑地址转换 在多处理机系统中,所有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 见图2­2) ,而偏移量是一个32位长的字段。我们将在本章“快速访问段描 述符”一节描述断选择符字段。 图2­2:段描述符格式 为了快速方便地找到段选择符,处理器提供段寄存器,段寄存器的唯一目的是存放段选择符。这些段寄存器 称为cs ,ss ,ds ,es ,fs 和gs 。尽管只有6 个段寄存器,但程序可以把同一个段寄存器用于不同的目的, 方法是先将其值保存在存储器中,用完后再恢复。 6 个寄存器中3 个有专门的用途: cs 代码段寄存器,指向包含程序指令的段。 ss 栈段寄存器,指向包含当前程序栈的段。 ds 数据段寄存器,指向包含静态数据或者全局数据的段。 其它三个段
显示全部
相似文档