第二个部件是寄存器堆,其实就是一个存东西的地方,跟内存呀硬盘呀一样,只不过离cpu近,就光用距离除以电流流速来说都能说明它比较快。所以一些运算出来的中间结果呀,甚至我从内存中读出来要做加法或者要写入内存的数据都先放寄存器里面。寄存器都一样的你存哪个都行,只不过为了统一,别一个人一个样,把寄存器分门别类弄了些专用的功能,地址数据就放你地址数据该存的寄存器,表示状态的数据就放在你状态该存的寄存器,仅此而已。寄存器正因为有不同人给它赋予定义才麻烦,就比如IO接口中的端口,就是寄存器而已,只不过比如像硬盘接口,你往它3号端口写个011101啥的,他就表示你要读数据了,然后硬盘把数据放到4号寄存器等着你读。
第三个部件是算术逻辑单元,你可以先假设它就是个只能执行加法的部件,8个针脚数据1,8个针脚数据2,再来8个针脚表示这俩数据的和,完事。
第四个部件我不想叫它控制单元,我感觉我一开始困惑的就是因为这种叫法,我感觉它更像是一种布线的方式,只不过抽象地说出来逼格高,更容易写成教材。简单说就是几个针脚接收指令,另几个针脚输出各种不同高低电平信号,连接在其他部件的针脚上起到一些控制作用。你比如我输入一个“写入内存”的指令,那我输出的针脚肯定有一个是接在内存的“是否写入”这个针脚上,这不就控制了么。
总结起来,其实部件就那么几种,存储部件:寄存器呀,RAM ROM呀;控制部件:就是联系所有部件的控制它们可读可写可加这种逻辑的;算数部件:数学运算用的;发动机部件:这我给命名成发动机部件吧,就是时钟信号产生,还有程序计数器,这些都是将整个部件激活、发动的感觉,没有它们就没了源动力。外设部件:也可以叫IO部件,注意千万不要把硬盘理解成存储部件,它跟网口、鼠标、键盘是一样的,都是IO,你能从磁盘中读数据,你也能从键盘中读数据,当它们接到IO接口上时,全都视为同一个东西了。
我拿键盘举个例子,不管谁家生产的键盘,都要接在我一个叫“键盘接口”的东西上,这个键盘接口中有5个端口,1号2号3号4号5号,其实就是寄存器,接口上面的寄存器就叫端口。我这个键盘生产商可以写个说明书,告诉大家你们听好啦,1号端口就是我的按键数据,我按了键盘中的A,我就往1号端口中写00100011,你cpu读到了怎么处理我就不管啦。当然我很好心,我给你2号端口也搞一个数据,为0的时候说明我没按键,为1的时候我就按键了,这够可以了吧。这时候cpu就可以处理了,我去读这个2号端口的数据,就像我读内存数据一样,读到了我发现它是1,那我知道键盘按键了,我接着读1号端口的数据,然后各种处理最终给显示器接口中的一堆端口写上一堆奇奇怪怪的数据,显示器读到这些数据后又做了一堆处理最终在屏幕上亮了几个灯泡,亮出了一个A。这里面cpu不断读2号端口看键盘有没有操作就叫用轮询IO的方式检查设备,读了1号端口的数据做各种处理最终给显示器接口写入数据,就是驱动程序。最后显示器读这些数据显示到屏幕上,那这是另一个设备的物理细节了,它里面也有个像我们这个cpu的东西就不去细究了。
完美,不过上面的过程又有些问题,如果io设备很多,轮询io的方式就很没效率了,最好是io有动作的时候主动通知cpu。那可以这样做,比如键盘有动作,我不是往我2号端口写数据了,而是往你cpu中一个寄存器中写一个号码,cpu读到这个寄存器中有数据了,通过查它的号码找到对应驱动程序的内存地址,执行这个程序。这个过程就叫中断,而查询号码去找程序的地方,叫做中断向量表。这里其实我真的也不想叫它中断,因为又是这个词让我困惑好久。因为cpu是通过增加一个时钟周期专门检测是否有中断信号产生,也就是说如果没有任何中断信号,这个时钟周期也是需要空跑一次的。所以你看,从更物理的时钟周期的层面看,这个中断方式仍然是轮询,只不过轮询的单位不是指令,而是时钟。