2.8 总线与地址
通过前面几节的学习,我们可以看到,CPU与内存、各种外部设备等IP之间都是通过总线相连的。CPU如果想访问内存,或控制外部设备的运行,该如何操作呢?很简单,通过地址访问。在一个计算机系统中,CPU内部的寄存器是没有地址的,可直接通过寄存器名访问。而内存和外部设备控制器中的寄存器都需要有一个地址,然后CPU才能通过地址去读写这些外部设备控制器的寄存器,控制外部设备的运行,或者根据地址去读写指定的内存单元。
2.8.1 地址的本质
地址到底是什么?在一个计算机系统中,计算机是如何给内存RAM、外部设备控制器的寄存器分配地址的?在搞清楚这个问题之前,我们需要先把地址的概念搞清楚。学过数字电路的同学应该记得译码器这样一种组合逻辑电路器件:一组输入信号,通过译码转换,会选中一个输出信号,输出信号可以是高电平、低电平,甚至是一个脉冲。计算机的内存简单点理解,其实就是将一系列存储单元和译码器组装在一起。内存中包含很多存储单元,为了方便管理,我们需要将这些存储单元进行编号管理,每一个存储单元对应一个编号。当CPU想访问其中一个存储单元时,可通过CPU管脚发出一组信号,经过译码器译码,选中与这个信号对应的存储单元,然后就可以直接读写这块内存了。CPU管脚发出的这组信号,也就是存储单元对应的编号,即地址。
以图2-62为例,假如我们的RAM容量大小为4字节,那么需要两根信号线就可以访问这4个存储单元了:当A1A0分别等于00、01、10、11时,集成在内存RAM中的译码器经过译码,就可以分别选中RAM中的四个存储单元的其中一个。
图2-62 信号线与地址
如果你想把内存RAM容量升级到8字节,也很简单,直接再加一块RAM和一根片选线CS就可以了。假如CS片选线低电平有效,那么当CSA1A0分别为000、001、010、011时,CPU会访问上面一片内存RAM的4字节存储单元;当CSA1A0分别为100、101、110、111时,CPU就会访问下面一片内存RAM的4字节存储单元。从CPU管脚发出的一组由CSA1A0组成的不同控制信号,与内存RAM中的存储单元一一对应,我们可以把它们看作一组地址编码。对于一个8字节大小的RAM来说,其存储单元对应的地址编码分别为000、001、010、011、100、101、110、111。这些控制信号可以通过CPU管脚直接发出,不同的控制信号代表不同的地址,通过译码器译码,选中RAM中不同的存储单元,实现CPU对RAM的随机读写。
通过上面的简单示例可以看到,地址的本质其实就是由CPU管脚发出的一组地址控制信号。因为这些信号是由CPU管脚直接发出的,因此也被称为物理地址。地址信号线的位数决定了寻址空间的大小,如上面的两根A1A0地址信号线,有4字节的寻址空间;CSA1A0三根地址信号线有8字节的寻址空间。在一个32位的计算机系统中,32位的地址线有4GB大小的寻址空间。
需要注意的是,寻址空间和一个计算机系统实际的内存大小并不是一回事。例如在图2-62中,我们使用CSA1A0表示地址信号线,有8字节的寻址空间,但在实际的系统中,我们可能只使用上面一片RAM作为我们的内存,那么内存的地址为000、001、010、011。其他地址100、101、110、111是不可访问的。
在带有MMU的CPU平台下,程序运行一般使用的是虚拟地址,MMU会把虚拟地址转换为物理地址,然后通过CPU管脚发送出去,地址信号通过译码,选中指定的内存存储单元,再进行读写操作。
2.8.2 总线的概念
如果CPU和内存RAM直接相连,那么内存RAM中的每一个存储单元的地址也就确定了。早期的计算机都是直接相连的,现在的计算机系统中CPU一般都是通过总线与内存RAM、外部设备相连的,如图2-63所示,CPU处理器和北桥通过系统总线连接,内存RAM和北桥通过内存总线连接,CPU和各个设备之间可以通过共享总线的方式进行通信。
图2-63 X86处理器的PCI总线
总线其实就是各种数字信号的集合,包括地址信号、数据信号、控制信号等。有的总线还可以为挂到总线上的设备提供电源。一个计算机系统中可能会有各种不同的总线,不同的总线读写时序、工作频率不一样,不同的总线之间通过桥(bridge)来连接。桥一般是一个芯片组电路,用来将总线的电子信号翻译成另一种总线的电子信号。如图2-63中的北桥,用来将CPU从系统总线发过来的电子信号转换成内存能识别的内存总线信号,或者显卡能识别的PCI总线信号,进而完成后续的数据传输和读写过程。
使用总线有很多优点,总线作为一种工业标准,大大促进了计算机生态的发展。大家生产的设备都采用相同的总线接口,都可以很方便地添加到计算机系统中,不同的设备遵循相同的总线协议与计算机通信。在一个计算机系统中,生产显卡、CPU、鼠标、键盘、声卡等周边设备的不可能都是同一个厂家,那么不同厂家生产的设备为什么能方便地集成到一个计算机系统中呢?我们去电脑城攒机时,不同厂家、不同品牌的内存和显卡,为什么插到主板上都可以直接运行呢?原因很简单,大家都遵循相同的总线协议和通信标准,按照约定的标准和接口生产各自的设备就可以了。这就是为什么你买的各种计算机配件,如声卡、显卡、鼠标、键盘、显示器,可以即插即用的原因。
2.8.3 总线编址方式
图2-64 ARM处理器的AMBA总线
内存RAM和外部设备都挂到同一个总线上,那么计算机系统如何为这些设备分配地址呢?计算机一般采用两种编址方式:统一编址和独立编址。统一编址,顾名思义,就是内存RAM和外部设备共享CPU的寻址空间,如图2-64所示,ARM、MIPS架构的CPU都采用这种编址方式。
在统一编址模式下,内存RAM、外部设备控制器的寄存器、集成在外部设备控制器内部的RAM共享CPU的可寻址空间。在统一编址模式下,CPU可以像操作内存一样去读写外部设备的寄存器和内部RAM。
和统一编址相对应的是独立编址。在独立编址模式下,内存RAM和外部设备的寄存器独立编址,分别占用不同的地址空间。如X86架构的CPU,外部设备的寄存器有独立的64KB空间,需要专门的IN/OUT指令才能访问,这片独立编址的64KB大小的空间也被称为I/O地址空间。