操作系统的一项重要工作是管理各种
I/O 设备,包括鼠标、键盘、触摸板、磁盘驱动器、显示适配器、USB 设备、位图屏幕、LED、模数转换器
, On/off 开关、网络连接、音频 I/O、打印机等。
I/O 系统需要接收应用程序 I/O 请求并将其发送到物理设备,然后接收从设备返回的任何响应并将其发送到应用程序。
I/O 设备可分为两类 −
- 块设备 − 块设备是驱动程序通过发送整个数据块与之通信的设备。 例如,硬盘、USB 摄像头、Disk-On-Key
等。
- 字符设备 − 字符设备是驱动程序通过发送和接收单个字符(字节、八位字节)与之通信的设备。
比如串口、并口、声卡等
设备控制器
设备驱动程序是可以插入操作系统以处理特定设备的软件模块。 操作系统借助设备驱动程序来处理所有
I/O 设备。
设备控制器的工作方式类似于设备和设备驱动程序之间的接口。 I/O 单元(键盘、鼠标、打印机等)通常由一个机械组件和一个电子组件组成,其中电子组件称为设备控制器。
每个设备总是有一个设备控制器和一个设备驱动程序来与操作系统进行通信。 一个设备控制器可能能够处理多个设备。
作为一个接口,它的主要任务是将串行比特流转换为字节块,并根据需要进行纠错。
任何连接到计算机的设备都是通过插头和插座连接的,插座连接到设备控制器。 以下是连接 CPU、内存、控制器和
I/O 设备的模型,其中 CPU 和设备控制器都使用公共总线进行通信。
同步与异步 I/O -
Synchronous 同步 I/O − 在此方案中,CPU 执行等待 I/O 进行
- Asynchronous 异步 I/O − I/O 与 CPU 执行同时进行
与 I/O 设备的通信
CPU 必须有办法将信息传入和传出 I/O 设备。 可以通过三种方式与 CPU 和设备进行通信。
- 特殊指令 I/O
-
内存映射 I/O
- 直接内存访问 (DMA)
特殊指令 I/O
这使用专门用于控制 I/O 设备的 CPU 指令。 这些指令通常允许将数据发送到 I/O 设备或从
I/O 设备读取。
内存映射 I/O
使用内存映射 I/O 时,内存和 I/O 设备共享相同的地址空间。 该设备直接连接到某些主内存位置,因此
I/O 设备可以在不经过 CPU 的情况下将数据块传输到内存或从内存传输。
在使用内存映射 IO 时,操作系统会在内存中分配缓冲区并通知 I/O 设备使用该缓冲区向 CPU
发送数据。 I/O 设备与 CPU 异步操作,完成后中断 CPU。
这种方法的优点是每条可以访问内存的指令都可以用来操作 I/O 设备。 内存映射 IO 用于大多数高速
I/O 设备,如磁盘、通信接口。
直接内存访问 (DMA)
键盘等慢速设备在传输每个字节后都会对主 CPU 产生中断。 如果诸如磁盘之类的快速设备为每个字节生成一个中断,则操作系统将花费大部分时间来处理这些中断。
因此,典型的计算机使用直接内存访问 (DMA) 硬件来减少这种开销。
直接内存访问 (DMA) 是指 CPU 授予 I/O 模块在不参与的情况下读取或写入内存的权限。
DMA 模块本身控制主存储器和 I/O 设备之间的数据交换。 CPU 只在传输的开始和结束时参与,只有在整个块传输完毕后才会中断。
直接内存访问需要一个称为 DMA 控制器 (DMAC) 的特殊硬件来管理数据传输并仲裁对系统总线的访问。
控制器使用源和目标指针(读取/写入数据的位置)、用于跟踪传输字节数的计数器以及设置(包括 I/O
和内存类型、中断和 CPU 周期状态)进行编程。
操作系统使用DMA硬件如下 −
轮询与中断 I/O
计算机必须具有检测任何类型输入到达的方法。 发生这种情况的方式有两种,称为轮询和中断。 这两种技术都允许处理器处理随时可能发生且与当前正在运行的进程无关的事件。
轮询 I/O
轮询是 I/O 设备与处理器通信的最简单方式。 定期检查设备状态以查看是否是下一次 I/O
操作的时间的过程称为轮询。 I/O 设备只是将信息放入状态寄存器,处理器必须来获取信息。
大多数情况下,设备不需要注意,当需要注意时,它必须等到轮询程序下一次询问它。 这是一种低效的方法,并且处理器的大部分时间都浪费在了不必要的轮询上。
将这种方法比作一位老师不断询问班级中的每个学生,一个接一个地询问他们是否需要帮助。 显然,更有效的方法是让学生在需要帮助时通知老师。
中断 I/O
另一种处理 I/O 的方案是中断驱动方法。 中断是需要注意的设备向微处理器发出的信号。
当 CPU 接收到中断时,设备控制器在需要 CPU 的注意时将中断信号放在总线上,它保存其当前状态并使用中断向量(用于处理各种事件的
OS 例程的地址)调用适当的中断处理程序。 处理完中断设备后,CPU 会继续执行其原始任务,就好像它从未被中断过一样。
|