2.1 IO的通路--总线
IO是通过共享一条总线的方式实现的。总线也就是一条或者多条的物理导线,导线上的电位时刻相等,这样连接到总线上的所有部件都会接收到相同的信号。也就是说总线是共享的,同一时刻只有一个部件在接收或者发送,是半双工的工作模式。
所有部件按照仲裁总线或中断总线给出的信号来判断当前时刻总线由哪个部件来使用。产生仲裁或者中断电位的可能是CPU也可以是总线上的其他设备。如果CPU要向某个设备输出,那么CPU主动做中断。如果设备要向CPU发送信号,则由设备产生中断信号通知CPU。
图2-1 计算机总线示意图
如图2-1所示,主板上的各个部件由总线连接起来,图中只有8条总线,实际上总线数目远不止8条。这些导线密密麻麻的刷在电路板上,由于导线非常密集,在高频震荡时会产生很大的干扰,所以人们将这些导线分组印刷到不同的电路板上,再将这些电路板压合起来,形成一块板,这就是多层印刷电路板(多层PCB Printed Circuit Board)。
目前最新的主板架构中,高速总线比如PCIE2.0往往直接接入北桥,南桥只连接低速总线。
1 PCI总线(Peripheral Component Interconnect 外设部件互连标准)
PCI总线是目前台式机与服务器所普遍使用的一种南桥与外设连接的总线技术。
PCI总线的地址总线和数据总线是分时复用的。这样的好处是,一方面可以节省插件的管脚数,另一方面便于实现突发数据传输。在数据传输时,一个PCI设备作为发起者(主控,Initiator或Master),而另一个作为目标(从设备,Target或Slave)。总线上的所有时序的产生与控制,都由Master发起。PCI总线在同一时刻只能提供一对设备完成传输,这就要求有一个仲裁机构(Aribiter),来决定谁有权利拿到总线的主控权。
当PCI总线进行操作时,Master先置请求总线使用权的REQ#信号,当得到Aribiter的许可信号GNT#时,会将传输开始或结束的信号FRAME#置低,并在地址总线(也就是数据总线,地址线和数据线共享)上放置Slave地址,同时放置命令信号C/BE#,说明接下来的传输类型。
所有PCI总线上的设备都需对此地址译码,被选中的设备要置DEVSEL#(被选中信号)以声明自己被选中。当IRDY#(Master可以发送数据)与TRDY#(Slave可以发送数据)都置低时,可以传输数据。当Master数据传输结束前,将FRAME#置高以表明只剩最后一组数据要传输,并在传完数据后放开IRDY#以释放总线控制权。
2 PCI总线的中断共享
PCI总线可以实现中断共享,即不同的设备使用同一个中断而不会发生冲突。
2.2 计算机内部通信
1.连
网络系统首先就是都要连接起来,HUB总线,以太网交换,电话交换等,不管用什么连接方式,在这些层面上,每个网络点到其他网络点,总有通路,总是可达。
2.找
连接起来以后,由于节点太多,就需要命名区分。目前广泛使用的TCP/IP协议中,IP命名占了主导地位,其他的命名方式在IP看来都是非正统,全部都映射到了IP。比如·MAC地址和IP的映射,那么设备就需要有IP地址,然后用TCP/IP协议来实现节点到节点的通信。即OSI模型中的链路层实现查找。
3.发
发数据这个层面就是传输层考虑的了。
2.2.1 IO总线是否可以看作网络
CPU和各种外设都连接到一条总线上,这不正是以太网HUB的模型吗?HUB本身就是一个总线结构,所有接口都接到一条总线上,它所做的就是避免总线总线信号衰减,因此需要电源来增强总线上的电信号。
但是IO总线和以太网HUB模型还是有些区别。CPU和内存因为足够快,他们之间单独用一条总线连接,这个总线和慢速IO总线之间通过一个桥接芯片连接起来,这就是北桥芯片。北桥芯片连接了CPU、内存和IO总线。
CPU和北桥连接的总线叫系统总线,也称为前端总线。总线频率相当于CPU向外部存取数据时的数据传输速率。CPU频率则表示CPU运算时电路产生的速率。
前端总线的条数,例如64条或者128条,这叫做总线的位数。这不同于CPU位数,CPU位数是指寄存器和运算单元之间的总线条数。内存与北桥连接的总线叫内存总线。由于北桥太快,而IO总线速度相对于北桥太慢,所以北桥和IO总线之间往往需要增加一个网桥,叫做南桥。而南桥上一般集成了众多的外设控制器,比如磁盘控制器、USB控制器等。
IO总线不是一条总线,分为数据总线,地址总线以及控制总线。寻址用地址总线,发数据用数据总线,发中断信号为控制总线。而且IO总线是并行的,有32位总线或64位总线。
2.2.2 CPU、内存和磁盘之间通过网络来通信
CPU向磁盘要数据,也就是两个节点的通信,要通过电路来获取。凡是分割的节点之间,需要接触和通信,就可以成为网络。但是主板上的电容、电阻和蛇形线都保障了电路的稳定和高速,那么类比于OSI模型,计算机总线网络就是一个只有物理层、网络层和上三层的模型。
按照“连找发”三元素理论,分析一个CPU向磁盘要数据的例子。
“连”这个元素已经具备,因为是通过总线连接。
“找”元素。首先要有区分,才能体现“找”。这个区分体现在主机总线中就是设备地址映射。每个IO设备在启动时都要向内存中映射一个或多个地址,这个地址有8位长,又称为IO端口。针对这个地址的数据,统统被北桥芯片重定向到总线上实际的设备上。假如IDE磁盘控制器地址被映射到地址0xA0,CPU根据程序机器代码,向这个地址发出多条指令来完成一个读操作。这就是“找”。
“发”元素。首先CPU将这个IO地址放到系统总线上,北桥接收到之后,等待CPU发送第一个针对这个外设的指令,然后CPU发送如下3条指令。
第一条:指令中包含了表示当前指令时读还是写的位,而且包含其他的选项,例如操作完成时是否用中断来通知CPU处理,是否启用磁盘缓存等。
第二条:指明应该读取的硬盘逻辑块号(LBA)。
第三条:给出了读取出来的内容应该存放到内存中哪个地址中。
这三条指令被北桥发送到IO总线上的磁盘控制器来执行。磁盘控制器接收到第一条指令后知道是读指令,以及一些操作,等待第二条指令的硬盘逻辑号。接收到这个指令后,就会进行磁盘实际扇区和逻辑快的对应查找,查找完成后,控制器驱动磁头寻道,等盘体旋转到那个扇区后,磁头开始读取数据。在读取数据时,磁盘控制器接收到第三条指令,有了存储地址后,磁盘控制器直接通过DMA技术(直接内存寻址)并执行写操作。数据存到内存中之后,CPU就从内存中取数据,再进行其他数据。
控制器对磁盘发出的一系列指令形成了两大体系,一个是ATA指令集,一个是SCSI指令集。SCSI指令集比ATA指令集高效,广泛应用于服务器和磁盘阵列环境中。