计算机组成 -- IO设备
接口 + 设备 – 适配器模式
- 大部分的输入输出设备,都有两个组成部分,一个是接口,另一个是实际的IO设备
- 硬件设备并不是直接接入到总线上和CPU通信的,而是通过接口,用接口连接到总线上,再通过总线和CPU通信
- 串行接口、USB接口等都是计算机主板上内置的各个接口,实际使用的硬件设备,都需要插入到这些接口上,才能和CPU通信
- 接口本身是一块电路板,CPU不需要和实际的硬件设备打交道,只需要和这个接口电路板打交道
- 设备里面的三类寄存器(状态寄存器、命令寄存器、数据寄存器),都在接口电路上,而不在实际的设备上
- 除了内置在主板上的接口外,有些接口可以集成在设备上 – IDE(Integrated Device Electronics)硬盘
- 设备的接口电路直接在设备上,只需要通过一个线缆,把集成了接口的设备连接到主板上即可
- 接口和设备分离:各种输入输出设备的制造商,根据接口的控制协议,来设计各种外设
- Windows设备管理器
- Devices:着重实际的IO设备本身
- Controllers:着重输入输出设备接口里面的控制电路
- Adaptors:着重接口作为一个适配器后面可以插上不同的实际设备
CPU控制IO设备
- 无论是内置在主板上的接口,还是集成在设备上的接口,除了三类寄存器之外,还有对应的控制电路
- 通过这个控制电路,CPU可以向这个接口电路板传输信号,来控制实际的硬件
- 三类寄存器(以打印机为例)
- 数据寄存器
- CPU向IO设备写入需要传输的数据
- 命令寄存器
- CPU发送一个命令,告诉打印机,要进行打印工作
- 此时打印机里面的控制电路会做两个动作
- 设置状态寄存器里面的状态为not-ready
- 实际操作打印机进行打印
- 状态寄存器
- 告诉CPU,现在设备已经在工作了,此时如果CPU再发送数据或者命令过来,打印机是不会响应的
- 直到前面的工作完成,状态寄存器重新变成ready状态,CPU才能发送下一个字符和命令
- 实际情况,打印机不会只有数据寄存器,还会有数据缓冲区
- CPU是不会真地一个一个字符交给打印机打印,而是一次性把整个文档传输到打印机的内存或者数据缓冲区里面
- 数据寄存器
MMIO + PMIO
MMIO
- CPU和IO设备通信,一样是通过CPU支持的机器指令来执行的
- MIPS的机器指令分类,并没有一种专门和IO设备通信的指令类型,MIPS的CPU是使用内存地址来和IO设备进行通信
- 计算机会把IO设备的各个寄存器,以及IO设备内部的内存地址,都映射到主内存地址空间来
- 主内存的地址空间里,会给不同的IO设备预留一段一段的内存地址
- CPU想要和这些IO设备进行通信时,就会通过地址线往这些地址发送数据;对应的数据信息,则是通过数据线来发送
- IO设备会监控地址线
- 在CPU往自己地址发送数据的时候,会把对应数据线里面传输过来的数据,接入到设备里面的寄存器和内存里面
- 上面的方式称为内存映射IO(Memory-Mapped I/O,MMIO)
PMIO
- MIPS的CPU很简单,所以只有MMIO;但Intel X86架构的计算机,可以设计专门和IO设备通信的指令,即in指令和out指令
- Intel CPU也支持MMIO,但还可以通过特定的指令,来支持端口映射IO(Port-Mapped IO,PMIO)
- PMIO和MMIO的核心区别,PMIO里面访问的设备地址,不再是内存地址空间里面,而是一个专门的端口
- 端口:和CPU通信的一个抽象概念
小结
- 无论是PMIO还是MMIO,CPU都会传送一条二进制的数据给到IO设备的对应地址
- 设备本身的接口电路,再去解码这个数据
- 解码后的数据,会变成一条设备支持的指令,再去通过控制电路去操作实际的硬件设备
- 对于CPU而言,并不需要去关心设备本身能够支持哪些操作,只需要在总线上传输一条条数据即可 – Command模式
参考资料
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.