《计算机光盘软件与应用》
我们之前的文章提到了操作系统的三个抽象,它们分别是进程、地址空间和文件,除此之外,操作系统还要控制所有的I/O设备。操作系统必须向设备发送命令,捕捉中断并处理错误。它还应该在设备和操作系统的其余部分之间提供一个简单易用的接口。操作系统如何管理I/O是我们接下来的重点。
不同的人对I/O硬件的理解也不同。对于电子工程师而言,I/O硬件就是芯片、导线、电源和其他组成硬件的物理设备。而我们程序员眼中的I/O其实就是硬件提供给软件的接口,比如硬件接受到的命令、执行的操作以及反馈的错误。我们着重探讨的是如何对硬件进行编程,而不是其工作原理。
什么是I/O设备?I/O设备又叫做输入/输出设备,它是人类用来和计算机进行通信的外部硬件。输入/输出设备能够向计算机发送数据(输出)并从计算机接收数据(输入)。I/O设备(I/Odevices)可以分成两种:块设备(blockdevices)和字符设备(characterdevices)。
块设备是一个能存储固定大小块信息的设备,它支持以固定大小的块,扇区或群集读取和(可选)写入数据。每个块都有自己的物理地址。通常块的大小在512-之间。所有传输的信息都会以连续的块为单位。块设备的基本特征是每个块都较为对立,能够独立的进行读写。常见的块设备有硬盘、蓝光光盘、USB盘与字符设备相比,块设备通常需要较少的引脚。
另一类I/O设备是字符设备。字符设备以字符为单位发送或接收一个字符流,而不考虑任何块结构。字符设备是不可寻址的,也没有任何寻道操作。常见的字符设备有打印机、网络设备、鼠标、以及大多数与磁盘不同的设备。
每个控制器都会有几个寄存器用来和CPU进行通信。通过写入这些寄存器,操作系统可以命令设备发送数据,接收数据、开启或者关闭设备等。通过从这些寄存器中读取信息,操作系统能够知道设备的状态,是否准备接受一个新命令等。为了控制寄存器,许多设备都会有数据缓冲区(databuffer),来供系统进行读写。例如,在屏幕上显示一个像素的常规方法是使用一个视频RAM,这一RAM基本上只是一个数据缓冲区,用来供程序和操作系统写入数据。那么问题来了,CPU如何与设备寄存器和设备数据缓冲区进行通信呢?存在两个可选的方式。第一种方法是,每个控制寄存器都被分配一个I/O端口(I/Oport)号,这是一个8位或16位的整数。所有I/O端口的集合形成了受保护的I/O端口空间,以便普通用户程序无法访问它(只有操作系统可以访问)。使用特殊的I/O指令像是
INREG,PORT
CPU可以读取控制寄存器PORT的内容并将结果放在CPU寄存器REG中。类似的,使用
OUTPORT,REG
CPU可以将REG的内容写到控制寄存器中。大多数早期计算机,包括几乎所有大型主机,如IBM360及其所有后续机型,都是以这种方式工作的。?控制寄存器是一个处理器寄存器而改变或控制的一般行为CPU或其他数字设备。控制寄存器执行的常见任务包括中断控制,切换寻址模式,分页控制和协处理器控制。”在这一方案中,内存地址空间和I/O地址空间是不相同的,如下图所示
INR0,4
和
MOVR0,4
这一设计中完全不同。前者读取I/O端口4的内容并将其放入R0,而后者读取存储器字4的内容并将其放入R0。这些示例中的4代表不同且不相关的地址空间。第二个方法是PDP-11引入的,?什么是PDP-11?
这两种寻址控制器的方案具有不同的优缺点。先来看一下内存映射I/O的优点。
在计算机设计中,几乎所有的事情都要权衡。内存映射I/O也是一样,它也有自己的缺点。首先,大部分计算机现在都会有一些对于内存字的缓存。缓存一个设备控制寄存器的代价是很大的。为了避免这种内存映射I/O的情况,硬件必须有选择性的禁用缓存,例如,在每个页面上禁用缓存,这个功能为硬件和操作系统增加了额外的复杂性,因此必须选择性的进行管理。第二点,如果仅仅只有一个地址空间,那么所有的内存模块(memorymodules)和所有的I/O设备都必须检查所有的内存引用来推断出谁来进行响应。?什么是内存模块?在计算中,存储器模块是其上安装有存储器集成电路的印刷电路板。”