Linux内存寻址之一:内存地址分类以及MMU介绍(转)

对于程序员来说,可以简单的把内存地址理解为一种访问存储单元的内容的一种方式。而对于80x86系列微处理器来说,我们需要区分三种地址:
1)逻辑地址
这种地址通常使用在机器语言里用于指定操作数或机器指令的地址。该类地址在著名的80x86分段体系架构中得到了很好体现,因此DOS程序员和windows程序员都不得不把他们的程序分成一段一段的(如代码段、数据段、堆栈段等等)。每一个逻辑地址都是由一个段(segment)和相对于段的实际起始地址的偏移地址(即offset 或 displacement)组成。
(2)线性地址(又称虚拟地址)
一个32位的无符号整数就可用于描述4GB(2的32次方=4G)的内存地址空间,相当于4,294,967,296个内存单元。线性地址通常用16进制表示,大小范围为:0x00000000 ~0xffffffff。
(3)物理地址
该类地址用于寻址/访问内存芯片里的存储单元。它们对应于微处理器引脚到内存总线之间的电信号。物理地址由一个32比特或38比特的无符号整数的16进制表示。
内存管理单元(MMU)可通过一个叫做段单元(segmentation unit)的硬件电路,将逻辑地址转换成线性地址;接着,通过一个叫做页单元(paging unit)的电路,再将线性地址转换成物理地址。如下图所示:
这里写图片描述
在有多个处理器的系统中,所有的CPU共享相同的内存。这就意味着,RAM芯片可能被相互独立的CPU们并发的访问。由于对RAM芯片的读操作和写操作都必须串行地执行,在总线和每个内存芯片之间添加了一个叫做内存仲裁器的硬件电路。这个电路的作用是:当RAM芯片处于空闲状态(这里的空闲,当然是指没有CPU在访问它)时,授权给CPU访问(俗称“放行”);当RAM芯片正忙(已经有CPU在使用该芯片)时,延迟(暂时禁止,即暂时“闭门谢客”)其他CPU对其访问。
甚至单处理器系统中,也会使用内存仲裁器。这是因为这些系统包括特殊的处理器——DMA控制器,它与CPU也存在并发操作的情况。当然,多处理器系统中的内存仲裁器电路更为复杂,因为它有更多的输入端口。例如,双核奔腾在每个芯片的入口维护了一个双端口的仲裁器,并且要求两个CPU在使用公用的总线时必须交换同步消息。从编程的角度看,仲裁器是隐而不见的,因为它是完全由硬件电路管理的。

你可能感兴趣的:(内存)