我们在前面的章节搭建了最简单的电路,在这里面,计算机的输入设备就是一个一个开关,输出设备呢,是一个一个灯泡。的确,早期发展的时候,计算机的核心是做“计算”。
我们从“计算机”这个名字上也能看出这艺点。不管是中文名字“计算机”,还是英文名字“Computer”,核⼼都是在”计算“这两个字上。不过,到了今天,这些“计算”的贡作,更多的是艺个幕后工作。
我们讨论是使用自己的PC,还是智能手机,这部分时间都是在和计算机进行各种“交互操作”。换句话说,就是在和输入输出设备打交道。这些输入输出设备也不再是个一个开关,
或者一个一个灯泡。你在键盘上直接敲击的都是字符,而不是“0”和“1”,你在显示意器上看到的,也是直接的图形或者文字的画面,而不是一个一个闪亮或者关闭的灯泡。
想要了解这其中的关窍,那就请你和我一起来看一看,计算机里面的输入输出设备。
一、经典的适配器模式
1、硬件设备并不是直接和CPU直接通信的
2、内置在主板上的接口
3、CPU的三级缓存
二、经典的适配模式
1、把接口和实际设备分离
2、软件的设计模式口
3、Windows操作系统
三、CPU是如何控制I/O设备的?
首先是数据寄存器
然后是命令寄存器
而状态寄存器
四、发挥总线的价值
1、MIPS的CPU到底是如何通信
2、IntelX86
这个,其实也有点像我们在设计模式⾥⾯的Command模式。我们在总线上传输的,是一个个数据对象,然后各个接受这些对象的设备,再去根据对象内容,进行实际的解码和命令执行。
这是一张我自己的显卡,在设备管理器里面的资源(Resource)信息。你可以看到,里面既有MemoryRange,这个就是设备对应映射到的内存地址,也就是我们上⾯所说的MMIO的访问方式
。同样的,里面还有I/O?Range,这个就是我们上⾯所说的PMIO,也就是通过端⼝来访问I/O设备的地址。最后,里面还有一个IRQ,也就是会来⾃于这个设备的中断信号了。
五、总结与延伸
好了,讲到这里,不知道,现在你是不是可以把CPU的指令、总线和I/O设备之间的关系彻底串联起来了呢?我来带你回顾一下。
CPU并不是发送一个特定的操作指令来操作不同的I/O设备。因为如果是那样的话,随着新的I/O设备的发明,我们就要去扩展CPU的指令集了。
在计算机系统里面,CPU和I/O设备之间的通信,是这么来解决的。
首先,在I/O设备这⼀侧,我们把I/O设备拆分成,能和CPU通信的接⼝电路,以及实际的I/O设备本身。接⼝电路里面有对应的状态寄存器、命令寄存器、数据寄存器、数据缓冲区和设备内存等等
。接⼝电路通过总线和CPU通信,接收来⾃CPU的指令和数据。⽽接⼝电路中的控制电路,再解码接收到的指令,实际去操作对应的硬件设备。
而在CPU这⼀侧,对CPU来说,它看到的并不是已个个特定的设备,而是已个个内存地址或者端⼝地址。CPU只是向这些地址传输数据或者读取数据。所需要的指令和操作内存地址的指令其实没有什么本质差别。
通过软件层面对于传输的命令数据的定义,而不是提供特殊的新的指令,来实际操作对应的I/O硬件。