文章目录
- 接口和设备:经典的适配器模式
- CPU是如何控制IO设备的
- 信号和地址:发挥总线的价值
- 内存映射IO(MMIO)
- 端口映射IO(Port-Mapped IO)
- Command模式
- 总结
接口和设备:经典的适配器模式
大部分的输入和输出设备都有两个组成部分:第一个是接口,第二个是实际的IO设备。
我们的硬件设备并不是直接接入到总线上和CPU通信的,而是通过接口,用接口连接到总线上,再通过总线和CPU通信。
CPU是如何控制IO设备的
以打印机为例,分析CPU如何控制IO设备
- 数据寄存器(Data Register):CPU向IO设备写入需要传输的数据,比如要打印”wangkai“,我们先要发送一个”w“给到对应的IO设备
- 命令寄存器(Command Register ): CPU发送一个命令,告诉打印机,要进行打印工作,打印机里的控制电路会做两件事情
- 设置我们状态寄存器里的状态,设置为not-ready。
- 实际操作打印机进行打印。
- 状态寄存器(Status Register):not-ready告诉CPU,设备已经在工作了,CPU再发送命令来是没有用的。ready状态告诉CPU可以发送下一个字符和命令
实际情况下,打印机里还有数据缓冲区,CPU也不是一个字符一个字符交给打印机去打印的,而是一次性将文档传输到打印机的内存或者数据缓冲区里一起打印。
信号和地址:发挥总线的价值
CPU和IO设备的通信,一样是通过CPU支持的机器指令来执行的。
内存映射IO(MMIO)
为了能让CPU尽可能的简单,计算机把IO设备的各个寄存器、以及IO设备内部的内存地址,都映射到主内存地址空间来。
主内存的地址空间,会给不同的IO设备预留一段一段的内存地址。
CPU要和这些IO设备进行通信的时候,就往这些地址发送数据。
IO设备会监控地址线,在CPU往自己地址发送数据的时候,把对应的数据先里面传输过来的数据,接入到对应的设备里面的寄存器和内存里面来。
CPU无论是向IO设备发送命令、查询状态、传输数据都是以这样的方式,这种方式叫做内存映射IO(Memory-Mapped I/O,简称 MMIO)
端口映射IO(Port-Mapped IO)
Intel x86架构的计算机可以设计专门和IO设备通信的指令,in和out指令
Intel 的CPU虽然支持MMIO,它还可以通过特定的指令来支持端口映射IO(Port-Mapped I/O,简称 PMIO)或者也可以叫独立输入输出(Isolated I/O)
PMIO访问的设备地址是一个专门的端口,并不是在内存地址空间里的,这个端口并不是一个硬件上的插口,而是和CPU通信的一个抽象概念。
Command模式
- 无论是PMIO还是MMIO,CPU都会传送一条二进制的数据,给到IO设备对应的地址。
- 设备自己本身的接口电路,再去解码这数据。
- 解码之后的数据,会变成设备支持的一条指令,再去通过控制电路去操作实际的硬件设备。
- 对于CPU来说,他不需要关心设备本身能支持哪些操作,只是在总线上传输一条条数据就好了。
在总线上传输的是一个个数据对象,接收这些对应的设备,根据具体的对象内存,进行实际的解码和命令执行。
总结
CPU并不是发送一个特定的操作指令来操作不同的IO设备。解决CPU和IO设备之间的通信方式如下:
IO设备方向
- IO设备被拆分为能和CPU通信的接口电路、实际的IO设备本身。
- 接口电路里有状态寄存器、命令寄存器、数据寄存器、数据缓冲区、设备内存等。
- 接口电路通过总线和CPU通信,接收来自CPU的指令和数据。
- 接口电路中的控制电路,再解码收到的指令,实际去操作对应的硬件设备。
CPU方向
- 对于CPU来说,看到的不是特定的设备,而是一个个内存地址或者端口地址。
- CPU只是向这些地址传输数据或者读取数据
- 需要的指令和操作内存地址的指令本质上没有什么差别。
- 通过软件层面对于传输的命令数据的定义,而不是提供特殊的新的指令,来实际操作对应的IO硬件。