2.8. I/O

2.8.1. I/O 接口

接口是两个系统或两个部件之间的交接部分,可以是两种硬设备之间的连接电路,也可以是两个软件之间的共同逻辑边界。

I/O 接口是主机与I/O设备间设置的硬件电路及其相应的软件控制,用于实现设备的选择、数据缓冲、通过接口传送控制命令等功能。

I/O 端口指接口电路中的一些寄存器这些寄存器用于存放数据、控制命令、状态信息等。CPU对I/O接口(或I/O设备)的信息读写,实际上都是对端口的操作。

2.8.1.1. I/O 接口类型

  • 按数据传送方式
    • 并行接口 / 串行接口

  • 按功能选择分类
    • 可编程 / 不可编程接口

  • 按通用性分类
    • 通用接口 / 专用接口

  • 按数据传送的控制方式分类
    • 程序型接口:用于低速设备,采用程序中断方式

    • DMA 接口:用于连接高速I/O设备

2.8.2. 内存映射 I/O

每个设备控制器都会有几个寄存器用来和 CPU 进行通信。通过写入这些寄存器,操作系统可以命令设备发送数据,接收数据、开启或者关闭设备等。通过从这些寄存器中读取信息,操作系统能够知道设备的状态,是否准备接受一个新命令等。

为了控制寄存器,许多设备都会有数据缓冲区 (data buffer),来供系统进行读写。例如,在屏幕上显示一个像素的常规方法是使用一个视频 RAM,这一 RAM 基本上只是一个数据缓冲区,用来供程序和操作系统写入数据。

CPU 与设备寄存器和设备数据缓冲区进行通信有三种方式。第一种方法是,每个控制寄存器都被分配一个 I/O 端口号,端口号是一个 8 位或 16 位的整数。操作系统可以使用类似 IN REG,PORT / OUT PORT,REG 的指令访问。

第二种方式是将所有控制寄存器映射到内存空间中。

第三种方式是一种混合方式,这种方式具有与内存映射 I/O 的数据缓冲区,而控制寄存器则具有单独的 I/O 端口。

在这种方式下,当 CPU 想要读入一个字的时候,将需要的地址放到总线地址线上,然后在总线的一条控制线上调用一个 READ 信号。还有第二条信号线来表明需要的是 I/O 空间还是内存空间。如果是内存空间,内存将响应请求。如果是 I/O 空间,那么 I/O 设备将响应请求。如果只有内存空间,那么每个内存模块和每个 I/O 设备都会将地址线和它所服务的地址范围进行比较。如果地址落在这一范围之内,它就会响应请求。

2.8.3. 直接内存访问

无论一个 CPU 是否具有内存映射 I/O,都需要寻址设备控制器以便与交换数据。CPU 可以从 I/O 控制器每次请求一个字节的数据,但是这么做会浪费 CPU 时间,所以经常会用到一种称为直接内存访问 (Direct Memory Access) 的方案。

直接内存访问是一种完全由硬件执行I/O交换的工作方式,主存与I/O 设备间高速交换批量数据,传送速度快。硬件DMA控制器从CPU完全接管对总线的控制,数据交换不经过CPU,直接在主存和I/O设备之间进行。

2.8.4. 参考链接