2.2.2 CPU、内存和磁盘之间通过网络来通信
CPU是一个芯片,磁盘是一个有接口的盒子,它们不是一体的而是分开的,而且都连接在这个网桥上。那么CPU向磁盘要数据,也就是两个节点之间的通信,必定要通过一种通路来获取,这个通路当然是电路!
凡是分割的节点之间,需要接触和通信,就可以成为网络。那么就不由地使我们往OSI模型上去靠,这个模型定义得很好。既然通信是通过电路,也就是物理层的东西,那么链路层都有什么内容呢?
大家知道,链路层相当于一个司机,它把货物运输到对端。司机的作用就是驾驶车辆,而且要判断交通规则做出配合。那么在这个计算机总线组成的网络中,是否也需要这样一个角色呢?答案是不需要。因为各个节点之间的路实在是太短、太稳定了!主板上那些电容、电阻和蛇行线,这一切都是为了保障这些电路的稳定和高速。在这样的一条高速、高成本的道路上,是不需要司机的,更不需要押运员!所以,计算机总线网络是一个只有物理层、网络层和上三层的网络!
下面我们就按照"连找发"三元素理论,去分析一个CPU向磁盘要数据的例子。
CPU与硬盘数据交互的过程
首先看"连"这个元素,这个当然已经具备了,因为总线已经提供了"连"所需的 条件。
再看"找"这个元素,前面说了,首先要有区分,才能有所谓"找",这个区分体现在主机总线中就是设备地址映射。每个IO设备在启动时都要向内存中映射一个或者多个地址,这个地址有8位长,又被称作IO端口。针对这个地址的数据,统统被北桥芯片重定向到总线上实际的设备上。假如,IDE磁盘控制器地址被映射到了地址0xA0,也就是十六进制A0,CPU根据程序机器代码,向这个地址发出多条指令来完成一个读操作,这就是"找"。"找"的条件也具备了。
接下来我们看看"发"这个元素!首先CPU将这个IO地址放到系统总线上,北桥接收到之后,会等待CPU发送第一个针对这个外设的指令。然后CPU发送如下3条指令。
第一条指令:指令中包含了表示当前指令是读还是写的位,而且还包含了其他选项,比如操作完成时是否用中断来通知CPU处理,是否启用磁盘缓存等。
第二条指令:指明应该读取的硬盘逻辑块号(LBA)。这个逻辑块在我们讲磁盘结构时会讲到,总之逻辑块就是对磁盘上存储区域的一种抽象。
第三条指令:给出了读取出来的内容应该存放到内存中哪个地址中。
这3条指令被北桥依次发送给IO总线上的磁盘控制器来执行。磁盘控制器收到第一条指令之后,知道这是读指令,而且知道这个操作的一些选项,比如完成是否发中断,是否启用磁盘缓存等,然后磁盘控制器会继续等待下一条指令,即逻辑块地址(号)。磁盘控制器收到指令之后,会进行磁盘实际扇区和逻辑块的对应查找,可能一个逻辑块会对应多个扇区,查找完成之后,控制器驱动磁头寻道,等盘体旋转到那个扇区后,磁头开始读出数据。在读取数据的同时,磁盘控制器会接收到第三条指令,也就是CPU给出的数据应该存放在内存中的地址。有了这个地址,数据读出之后直接通过DMA技术,也就是磁盘控制器可以直接对内存寻址并执行写操作,而不必先转到CPU,然后再从CPU存到内存中。数据存到内存中之后,CPU就从内存中取数据,进行其他运算。
上面说的过程是"读","写"的过程也可以以此类推,而且CPU向磁盘读写数据,和向内存读写数据大同小异,只不过CPU和内存之间有更高速的缓存。缓存对于计算机很重要,对于磁盘阵列同样重要,后面内容将会介绍到。
那么控制器对磁盘发出的一系列指令是怎么定义的呢?它们形成了两大体系,一个是ATA指令集,一个是SCSI指令集。SCSI指令集比ATA指令集高效,所以广泛用于服务器和磁盘阵列环境中。这些指令集,也可以称为协议,协议就是语言,就是让通信双方知道对方传过来的bit流里面到底包含了什么,怎么由笔划组成字,由字组成词,词组成句子,等等。