Hello.c源程序被编译系统翻译成了计算机能看懂的可执行目标文件hello之后就一直存放在磁盘中。今天,主人又在“口令发号中心”shell中发布了名为”./hello“的任务,为了搞清楚运行hello时发生了什么,我们得先了解下计算机中的硬件组织
主板【motherboard】
拆开计算机可以看到一块板子上有许多插槽、引脚、线路之类的,这个板子叫”主板“(英文名叫”Motherboard“)顾名思义,主板相当于一种城市,CPU、内存、显卡等各个组件都在主板这座城市里安家,并过着紧凑而又有条不紊的生活。主板上每个组件都有自己的家,也就是他们都有一个独属于他们的门牌号(专业术语是“I/O地址”),平时互相传输消息时就会非常阔气地包一辆Bus(总线)专车。但Bus专车数量太有限了,常常需要排很久的队,以前没有专车控制中心(总线控制器)的时候,组件们都把要传数据的消息发给CPU,CPU每时每刻都要处理上千条消息,实在太累了,而且治安也不好,经常发生插队(抢占)行为,因此主人就专门建了一个”专车控制中心”(总线控制器),组件们都将申请包车(获取总线控制权)的请求发到专车控制中心,大大减轻了CPU的工作量,CPU可乐呵了。
主板的构成中最重要的莫过于“芯片组”了,芯片组一般又分为两个桥接器来控制各组件的通信,分别是:北桥(Northbridge)负责连接速度较快的CPU、内存和显卡等;南桥(Southbridge)负责速度较慢的周边接口,包括硬盘、USB、网卡等。
芯片组总是操着世界和平的心干着最精细的活,它专门负责各个组件之间的通信(因为总线专车就是芯片组的一个组成部件),还负责给各组件分配电源,那是相当地忙碌啊,常常干一会儿就浑身发烫(尤其是北桥这个家伙,因为负责CPU与内存之间的沟通,常常散发高热量)因此,主人就在主板上外接一些小风扇或者是散热片帮助主板散热。
问:计算机组件这么多,芯片组要怎么知道如何负责通信啊?
芯片组:这得多亏了我的好伙计“总线(Bus)”,简直是新一代劳模!以前没有总线的时候,例如CPU想要跟某个I/O设备通信,那就在CPU与这个I/O设备间接一根线,但是你都看到了主板上有这么多组件呢,要是每两个组件间接一根线,那得多少根线啊,把城市线路弄得错综复杂不说,最麻烦的是要是来了个新人,还得规划线路布局……想着脑袋就疼,现在有了总线这个好家伙,大家都把自己挂在这一条“总线”上,当CPU想找谁了,就在上面吼一声。
总线【bus】
芯片组:通信其实就是传输数据,看到上图中的箭头了吗,就是我的好伙计“总线”了,它是用来传输数据的主要通道。如果说主板是一座城市,那么总线就像是城市里的公共汽车(bus),能按照固定行车路线,公交车携带的是乘客,总线则是携带信息字节在各个组件间传递。我们都知道一辆公交车容纳乘客的数量是规定好了的,总线也是一样,通常总线被人们规定一次只能传输一定长度的字节块,也就是我们常说的“字(word)”(字中的字节数,即字长,是一个基本的系统参数,在各个系统中又不尽相同)。我们假设字长为4个字节(32位),并且总线每次只传送一个字,但是很多时候我们传送的数据远远大于一个字,因此,总线下头又有许多小弟,而所有小弟传输的数据量(总线可同时传输的数据量)就成为”宽度(width)“,以比特(bit)为单位,总线宽度越大,传输性能就越好。
除此之外,我们都晓得公交车也是分很多种类的,比如跑长途的、普通的公交车,有的时候还可以包一辆公交车呢!总线也是一样的,在我们芯片组上的每条总线都被赋予一个特定功能,现在计算机一般有五类总线:数据总线、地址总线、控制总线、扩展总线、局部总线。
数据总线(Data Bus):这是专门为CPU和主存(RAM之间通信配备的一个伙计,因为他俩可以说是咱主板城的VVIP!干的活超级辛苦,而且从开机就没闲下来过,这个伙计平时就在CPU和主存间来回传送需要处理或是需要储存的数据;
地址总线(Address Bus):这个伙计用来指定在主存之中存储的数据的地址——往往CPU大哥吼上一声,被喊道的组件就得把CPU大哥要的数据先放到地址总线上,由这个伙计送到主存中,接着就是数据总线伙计干的事儿了;
控制总线(Control Bus):这个伙计将CPU大哥发出的信号/命令,传送到周边设备,告知这些设备要干活了;
扩展总线(Expansion Bus):连接扩展槽和计算机;
局部总线(Local Bus):取代更高速数据传输的扩展总线。
其中数据总线、地址总线、控制总线,也称“系统总线”,使我们经常说的“总线”。
嗯,让我把电话转接给总线,他会告诉你们更详细的内容。
……
总线:嘿,你好。首先,我先给你们介绍下我们这一行的行话吧,传送消息一方叫做“主模块”,接收消息的一方叫做“从模块”,除了偶尔的特殊情况,数据的传送都是在主模块与一个从模块之间进行,嗯,还有一个行业规定一定要记住“总线上同一时刻仅有一个主模块占用”!我们的工作有点像快递员的工作。
“总线控制器”是咱们快递员的头头,我们都由它管着,比如有几个主模块想要传送消息,必须先向头头“总线控制器”申请总线控制权,头头用一种算法判断出优先权,选出一个主模块同时给这个主模块限制了使用我们的时间(不能让其他主模块老等着嘛,都是客户呢!),接着呢,得到控制权的主模块得进行寻址(目的地址)通知被访问的从模块进行消息传输。得到从模块的确认后立即进入消息传送过程。消息传送根据读或写方式确定消息流向,“读”时为从模块到主模块“,”写“时由主模块到从模块。一次消息传送可以是传递一个数据,也可以是多个数据,我们还要在数据传送完成后或者在多个数据传送中进行错误检测(发错快递了啊,快递有损啊),一旦发现错误就得做出相应处理。大概就是下面这张图描绘的过程。