计算机内部通信
摘要:把单个组件如cpu,内存,控制器等当作节点,用总线电路将它们连接起来
"连找发"网络三元素模型
首先,网络是什么,用一句话来说就是将要通信的所有节点连接起来,然后找到目标,找到后就发送数据。这里把这种简单模型叫做“连找发”网络三元素模型,听起来非常简单。
1.连
网络系统当然首先都要连接起来,连接方式有很多种,比如HUB总线、以太网交换、电话交换、无线、直连、中转等。在这些层面上每个网络点到其他网络点,总有通路,总是可达。在“连起来”这个层面,就是OSI模型中链路层实现的功能。
2.找
节点之间连接起来之后,由于节点太多,怎么来区分呢?所以就需要有个区分机制。当然首先就想到了命名,就像给人起名一样。在目前广泛使用的网络互联协议TCP/IP中,IP这种命名方式占了主导地位,统一了天下。其他的命名方式在IP看来都是“非正统”的,全部被“映射”到了IP。比如MAC地址和IP的映射,Frame Relay中DLCI地址和IP的映射,ATM中ATM地址和IP的映射,最终都映射成IP地址。任何节点,不管所在的环境使用什么命名方式,到了TCP/IP协议的国度里,就都需要有个IP名(IP地址),然后全部用TCP/IP协议来实现节点到节点无障碍的通信。“找目标”这个层面是网络层实现的功能。
3.发
“发数据”这个层面,就是传输层需要保障的。至于发什么数据,数据是什么格式,这两个层面就不是网络通信所关心的了,它们已经属于OSI模型中上三层的内容了。
IO总线是否可以看作网络
IO总线可以接入多个外设,比如键盘、鼠标、网卡、显卡、USB设备、串口设备和并口设备等,最重要的当然要属磁盘设备了。讲到这里,大家的脑海中应该能出现这样一种架构:CPU、内存和各种外设都连接到一个总线上,这不正是以太网HUB的模型么?
HUB本身就是一个总线结构而已,所有接口都接在一条总线上,HUB所做的就是避免总线信号衰减,因此需要电源来加强总线上的电信号。
没错!仔细分析之后,发现它确实就是这么一个模型!不过IO总线和以太网HUB模型还是有些区别。
CPU和内存因为足够快,它们之间单独用一条总线连接。这个总线和慢速IO总线之间通过一个桥接芯片连接,也就是主板上的北桥芯片。这个芯片连接了CPU、内存和IO总线。CPU与北桥连接的总线叫做系统总线,也称为前端总线。这个总线的传输频率与CPU的自身频率是两个不同概念,总线频率相当于CPU向外部存取数据时的数据传输速率,而CPU自身的频率则表示CPU运算时电路产生的频率。前端总线的条数,比如64条或者128条,就叫做总线的位数。这个位数与CPU内部的位数也是不同的概念,CPU位数指的是寄存器和运算单元之间总线的条数。
内存与北桥连接的总线叫做内存总线。由于北桥速度太快,而IO总线速度相对北桥显得太慢,所以北桥和IO总线之间,往往要增加一个网桥,叫做南桥,在南桥上一般集成了众多外设的控制器,比如磁盘控制器、USB控制器等。
思考:这不正是个不折不扣的“网络”么?而且还是个不折不扣的“网桥”!我们看,CPU和内存是一个冲突域,IO总线是一个冲突域,桥接芯片将这两个冲突域桥接起来,这正是网桥的思想!我们知道了计算机系统原来就是一个网络啊!
在这个网络上,我们能够干点什么惊天动地的事呢?
提示: IO总线其实不是一条总线,它分成数据总线、地址总线和控制总线。寻址用地址总线,发数据用数据总线,发中断信号用控制总线。而且IO总线是并行而不是串行的,有32位或者64位总线。32位总线也就是说有32根导线来传数据,64位总线用64根导线来并行传数据。
CPU、内存和磁盘之间通过网络来通信
CPU是一个芯片,磁盘是一个有接口的盒子,它们不是一体的而是分开的,而且都连接在这个网桥上。那么CPU向磁盘要数据,也就是两个节点之间的通信,必定要通过一种通路来获取,这个通路当然是电路!(提示:当然也可以是辐射的电磁波,估计21世纪还应用不到CPU上)
OSI模型
凡是分割的节点之间,需要接触和通信,就可以成为网络。那么就不由得使我们往OSI模型上去靠,这个模型定义得很好。既然通信是通过电路,也就是物理层的东西,那么链路层都有什么内容呢?
大家知道,链路层相当于一个司机,它把货物运输到对端。司机的作用就是驾驶车辆,而且要判断交通规则做出配合。那么在这个计算机总线组成的网络中,是否也需要这样一个角色呢?答案是不需要。因为各个节点之间的路实在是太短、太稳定了!主板上那些电容、电阻和蛇行线,这一切都是为了保障这些电路的稳定和高速。在这样的一条高速、高成本的道路上,是不需要司机的!所以,计算机总线网络是一个只有物理层、网络层和上三层的网络!
强调:所有的网络都可以定义成连起来、找目标和发数据。也就是“连找发”模型,这也是构成一个网络的三元素。任何网络都必须具有这三元素(点对点网络除外)。连,代表物理层。物理层必须要有,如果没有物理层,要达到两点之间通信是不可能的。物理层可以是导线,可以是电磁波,总之必须有物理层。找,突出一个找字,既然要找,那么就要区分方法,也就是编址,比如IP等。发,突出一个发字,即指最上层发出数据。
例子
下面就按照“连找发”三元素理论,去分析一个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和内存之间有更高速的缓存。缓存对于计算机很重要,对于磁盘阵列同样重要。
CPU在对磁盘发送指令的时候,这些指令是怎么定义的?
这些指令其实是发给了主板南桥上集成的(或者是通过PCI接入IO总线的)控制器,比如ATA控制器或者SCSI控制器。然后控制器再向磁盘发出一系列的指令,让磁盘读取或者写入某个磁道、某个扇区等。CPU不需要知道这些,CPU只需要知道逻辑块地址是读还是写就可以了。让CPU产生这些信号的是磁盘控制器驱动程序。
那么控制器对磁盘发出的一系列指令是怎么定义的呢?
它们形成了两大体系,一个是ATA指令集,一个是SCSI指令集。SCSI指令集比ATA指令集高效,所以广泛用于服务器和磁盘阵列环境中。这些指令集,也可以称为协议,协议就是语言,就是让通信双方知道对方传过来的比特流里面到底包含了什么,怎么由笔划组成字,由字组成词,词组成句子等等。
计算机的主板上的各个部件本身就形成了一个网络,而且通过网卡,还可以连接到外部网络,成了一个网中之网。
本文转载为转载,作者找不到
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。