操作系统 - 程序控制 I/O
输入/输出操作(I/O)是操作系统的重要组成部分。I/O 操作实现了 CPU 与其他设备之间的通信。有多种 I/O 技术,如 programmed I/O、中断 I/O 和直接内存访问(DMA),其中 programmed I/O 是数据传输最简单、最基本的实现方式。
什么是 Programmed I/O?
Programmed I/O 是最简单的 I/O 形式之一,其中 CPU 需要承担所有工作。I/O 指令编写在计算机程序中,每次数据项传输都由程序指令发起。CPU 管理所有设备与内存之间的数据传输。在 programmed I/O 中,CPU 控制数据传输的所有方面,例如发起 I/O 操作、持续监控设备状态、在设备与寄存器之间传输数据、在寄存器与内存之间移动数据,以及判断操作何时完成。
Programmed I/O 可用于各种场景:
- 在键盘中,持续检查按键。
- 在鼠标中,持续检查鼠标位置和按钮状态。
- 在打印机中,持续检查打印机是否就绪。
- 在磁盘驱动器中,持续检查读/写头是否就位。
Programmed I/O 如何工作?
Programmed I/O 遵循由 CPU 管理的各种步骤的顺序模式。以下是使用打印机打印字符串的示例:
步骤 1 − 首先通过系统调用打开打印机来发起 I/O 操作。操作系统检查打印机是否可用,如果可用则授予访问权限;如果打印机正忙,则返回错误。
步骤 2 − 然后操作系统将您要传输的数据复制到内核缓冲区,如上图动画所示。
步骤 3 − 然后 CPU 持续检查打印机是否就绪(polling)。在上图动画中,可以看到 CPU 在打印机未就绪时的 polling 过程。
步骤 4 − 一旦打印机就绪,CPU 传输一个字节或字的数据。上图动画演示了每次打印机就绪时传输单个字母。
步骤 5 − 上述步骤 3 和 4 由 CPU 重复执行,直到完整字符串被打印。CPU 检查状态,然后逐字节/字符打印字符串。
Polling 是一种方法,其中 CPU 持续检查设备是否准备好进行下一次操作。它在循环中不断检查设备状态。因此,CPU 在设备响应之前一直处于忙碌状态。这也被称为 busy waiting。
Programmed I/O 中的 I/O 命令
Programmed I/O 中的主要命令如下所述:
控制命令 − 控制命令用于初始化 I/O 设备。它设置传输模式、数据格式或设备特定设置等参数。
示例 RESET_DEVICE, SET_PARITY EVEN, ENABLE_FLOW_CONTROL, SPIN_UP 等。
测试命令 − 测试命令检查 I/O 组件和设备的状态条件。它检查设备是否已开启、是否可用、先前操作是否成功完成,以及是否发生任何错误。
示例 − TEST_READY, TEST_BUSY, TEST_DEVICE_PRESENT, TEST_SEEK_COMPLETE, TEST_DRIVE_READY 等。
读命令 − 读命令要求 I/O 组件从设备检索数据到内部缓冲区。输入缓冲区中的数据通过数据总线由处理器访问。
示例 READ_CHAR, READ_DATA_REGISTER, READ_SECTOR, READ_MOUSE_DATA 等。
写命令 − 写命令指示 I/O 组件从数据总线获取数据。此数据传输到输出设备。
示例 − WRITE_STRING, WRITE_BYTE, WRITE_PIXEL, WRITE_SECTOR 等。
Programmed I/O 中的 I/O 寻址方法
In Programmed I/O 中,CPU 直接访问寄存器和数据端口来管理输入/输出操作。它可以使用两种寻址方法实现 −
- Memory-mapped I/O (MMIO)
- Port-mapped I/O (PMIO)
Memory-mapped I/O (MMIO)
Memory-mapped I/O 将寄存器映射到内存地址空间中。程序使用读写指令来访问设备。CPU 使用常规的 load/store 指令来访问 I/O。它允许使用标准的内存操作指令进行 I/O 操作。例如:*(volatile int*)0xFFFF0000 = 1;
Port-mapped I/O (PMIO)
In port-mapped I/O 中,设备通过与主内存分离的独立地址空间进行访问。x86 架构中的特殊 CPU 指令(IN 和 OUT)分别用于从这些 I/O 端口读取和写入数据。它在早期的微处理器中很有用,因为它们具有有限的地址空间,并且它保留了主内存地址范围用于实际内存。
Memory-mapped I/O 和 Port-mapped I/O 的区别
以下是 Memory-mapped I/O (MMIO) 和 Port-mapped I/O (PMIO) 之间的区别 −
| Memory-mapped I/O | Port-mapped I/O |
|---|---|
| 它共享内存地址空间。 | 它具有独立的 I/O 地址空间。 |
| 它具有标准的 load/store 指令。 | 它具有特殊的 I/O 指令 (IN, OUT)。 |
| 它用于现代系统、ARM、RISC-V。 | 它用于 x86 系统、遗留设备。 |
Programmed I/O 的优点
Programmed I/O 的优点如下 −
- 它易于理解和实现。
- 程序流程是线性的且确定的。这使得调试更容易。
- 不需要像 DMA 控制器或高级中断系统这样的硬件。
- 当传输数据量较少时,它很有用。
Programmed I/O 的缺点
以下是 Programmed I/O 的缺点:
- In Programmed I/O 中,由于轮询,CPU 在整个 I/O 操作过程中保持忙碌。因此,对于大数据传输它是低效的,正如动画中所见。
- 高延迟。
- 由于 CPU 忙于轮询,并发性有限。
- 资源利用低效。
- 吞吐量较低。
结论
Programmed I/O 是计算机系统中 I/O 操作的最简单和最基本的方法。它简单易用,但由于轮询导致 CPU 浪费,因为 CPU 持续忙于检查设备状态。本章详细解释了 programmed I/O、实际示例、其工作原理、命令、寻址方法,以及 programmed I/O 的优点和缺点。