从 CPU 连出来一把线:数据总线、地址总线、控制总线,这把线上挂着 N 个接口,有相
同的,有不同的,名字叫做存储器接口、中断控制接口、DMA 接口、并行接口、串行接口、
AD 接口……一个设备要想接入,就用自己的接口和总线上的某个匹配接口对接……于是总线
上出现了各种设备:内存、硬盘,鼠标、键盘,显示器……
对于 CPU 而言,如果它要发数据到某个设备,其实是发到对应的接口,接口电路里
有多个寄存器(也称为端口),访问设备实际上是访问相关的端口,所有的信息会由接口转给
它的设备。那么 CPU 会准备数据到数据总线,但是诸多接口,该发给谁呢?这时就须要为各接
口分配一个地址,然后把地址放在地址总线上,需要的控制信息放到控制总线上,就可以和设
备通信了。
对一个系统而言,通常会有多个外设,每个外设的接口电路中,又会有多个端口,
每个端口都需要一个地址,为他们标识一个具体的地址值,是系统必须解决的事,与此同时,
你还有个内存条,可能是 512M 或 1G 或更大的金士顿、现代 DDR2 之类,他们的每一个地址
也都需要分配一个标识值,另外,很多外设有自己的内存、缓冲区,就像你的内存条一样,你
同样需要为它们分配内存……你的 CPU 可能需要和它们的每一个字节都打交道,所以:别指望
偷懒,它们的每一寸土地都要规划好!这听起来就很烦,做起来可能就直接导致脑细胞全部阵
亡。但事情总是得有人去做,ARM 可能会这样做:他这次设计的 CPU 是 32 位的,最多也就
能寻址 2^32=4G 空间,于是把这 4GB 空间丢给内存和端口,让他们瓜分。但英特尔或许有
更好的分配方式……
(一)地址的概念
1)物理地址:CPU 地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大
一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS 等)。在程
序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到 CPU
的地址线上。
物理地址空间,一部分给物理 RAM(内存)用,一部分给总线用,这是由硬件设计
来决定的,因此在 32 bits 地址线的 x86 处理器中,物理地址空间是 2 的 32 次方,即 4GB,
但物理 RAM 一般不能上到 4GB,因为还有一部分要给总线用(总线上还挂着别的许多设备)。
在 PC 机中,一般是把低端物理地址给 RAM 用,高端物理地址给总线用。
2)总线地址:总线的地址线或在地址周期上产生的信号。外设使用的是总线地址,CPU
使用的是物理地址。
物理地址与总线地址之间的关系由系统的设计决定的。在 x86 平台上,物理地址就
是总线地址,这是因为它们共享相同的地址空间——这句话有点难理解,详见下面的“独立编
址”。在其他平台上,可能需要转换/映射。比如:CPU 需要访问物理地址是 0xfa000 的单元,
那么在 x86 平台上,会产生一个 PCI 总线上对 0xfa000 地址的访问。因为物理地址和总线地
址相同,所以凭眼睛看是不能确定这个地址是用在哪儿的,它或者在内存中,或者是某个卡上
的存储单元,甚至可能这个地址上没有对应的存储器。