操作系统——I/O设备管理(1)

计算机系统中不同类型的输入输出设备,如何对它们进行管理,使得各种设备资源能够得到充分、合理的利用,这是操作系统的一个主要的任务。

1、I/O硬件

电子专业的人关心的是硬件本身,他们看待输入输出设备是由芯片,导线,电源等等组成的一个硬件。

计算机专业的人从操作系统的角度看待输入输出设备,他们关心的是如何对它们进行编程。也就是这个硬件接受得控制指令是什么,完成的功能是什么,返回结果是什么等等。

1.1、I/O设备的类型

设备的交互对象来分:
  • 人机交互对象:视频显示器,键盘,鼠标,打印机等
  • 与计算机交互的设备:磁盘,磁带,传感器等
  • 计算机之间的通信设备:网卡,调制解调器等
设备的交互方向:
  • 输入设备:键盘,鼠标,扫描仪等
  • 输出设备:显示器,打印机等
  • 双向交互设备:磁盘,网卡等
按照数据的组织方式:
  • 块设备:以数据块来作为信息的存储和传输单位,如磁盘
  • 字符设备:以字符来作为信息的存储和传输单位,数据即字节流,只能顺序访问。如鼠标,串口,键盘等

1.2、设备控制器(适配器)

  • 仅仅有输入输出设备是不能实现它们的功能的,在输入和输出设备与CPU和内存之间还必须有一个对应的控制器。设备和对应的控制器相互合作才能完成相应的功能。
之所以把两者分开,而不是合二为一,是因为这样的话,在设计的时候能够更加模块化、更加通用。

  • 控制器和适配器的区别:适配器一般是印刷电路卡的形式,它可以很方便地插入到主板的扩充槽中。控制器一般是一组芯片,它主要是集成在主板上或者是I/O设备内部的。但是适配器和控制器的功能是一样的,都是完成设备与主机之间的连接和通信。
  • 在设备控制器上通常都有一个插槽,可以用电缆把它和相应的输入输出设备连接起来。在控制器和输入输出设备之间的接口可以定义为一个标准接口。
  • 例如:显示器连接在显卡上,显卡插在主板上。其它设备都有相应的控制器。

1.3、I/O地址

每一种输入输出设备都有一个相应的设备控制器,设备与设备控制器结合起来,才能完成相应的输入输出功能。
输入输出设备本身并不能直接跟CPU打交道,而是通过它的设别控制器跟CPU打交道。具体来讲,每个设备控制器里都有一些寄存器,用于和CPU进行通信,包括控制寄存器(控制设备发送数据,接收数据,打开或关闭等操作),状态寄存器(了解该设备的当前状态,就绪或忙碌)和数据寄存器等等。


但是CPU如何与这些控制寄存器以及数据缓冲区进行通信呢?

CPU如何访问它们的内容,解决方法主要有三种:

  • I/O独立编址:给所有设备控制器中的每一个寄存器分配一个唯一的I/O端口编号,也称为I/O端口地址,然后用专门的输入输出指令来对这些端口进行操作。(IN,OUT指令)
  • 内存映像编址:把所有设备控制器中的每一个寄存器都映射为一个内存地址,专门用于输入输出操作。端口地址空间和内存地址空间是统一编址的,总共只有一个地址空间,端口地址空间是内存地址空间的一部分,一般位于内存地址的高端,而地址低端为普通的内存地址。

优点:第一,编程方便,不需要专门的输入输出指令。第二,对普通内存的所有操作指令都可以用于输入输出端口。

缺点:第一,不能对控制寄存器的内容进行Cache,必须关闭。因为为了确保每次读入的都是新值,必须直接去访问I/O端口。第二,每一次都要判断访问的是内存还是I/O。

  • 混合编址:把两种编址方法结合起来。对于设备控制器当中的寄存器来说,采用的是I/O独立编址的方法,每一个寄存器都有一个独立的I/O端口地址。但是对于设备的数据缓冲区来说,采用的是内存映像编址的方法,把它们的地址统一到内存地址空间中。
根据以上的知识,I/O设备的类型,设备控制器以及I/O端口地址,能不能编程使用这些设备,来完成相应的输入输出功能?采用I/O控制方式。

2、I/O控制方式

当我们要给一个硬件设备编写驱动程序,如何让它正常地运转起来,这就需要用到I/O控制方式。 I/O控制就是要与I/O设备的设备控制器的各种寄存器进行通信。

当前的I/O控制方式主要有三种:程序循环检测方式(Programmed I/O)、中断驱动方式(Inerrupt-driven I/O)和直接内存访问方式(Direct Memory Access)。

2.1、程序循环检测方式

程序循环检测方式:在进行I/O操作之前要不断地检测该设备的控制器中的状态寄存器,看它是否空闲。如果空闲,就向控制器发出一条命令,启动这次I/O操作。
然后,在这个操作的进行过程中,也要循环地检测设备的当前状态,看它是否已经完成。最后,在I/O操作完成之后,如果这是一次输入操作,那么就要把读进来的数据保存到内存中的某个位置。
总之,完成I/O的整个过程中,控制I/O设备的所有工作都是由CPU来完成的。
缺点:在进行一个I/O操作时,要一直占用着CPU,这样就会浪费CPU的时间。


2.2、中断驱动方式

循环检测的控制方式会占用大量的CPU时间,为了让CPU在等待I/O完成的时候去执行其它的进程。我们采用中断技术,这种方法被称为是中断驱动的控制方式。
中断控制器负责管理系统中的所有的I/O中断,只有它才能向CPU发出中断请求。对于I/O设备,当它需要发送中断时,不是直接发给CPU,而是先发给中断控制器,并由它来决定是否要转发给CPU。
过程:

  • 当一个I/O设备完成了CPU交给它的任务的时候,它的控制器就会向中断控制器发出一个信号,中断控制器会判断一下,看看当前是否有一个中断正在处理,或者是否有一个优先级更高的中断。如果没有,就开始处理这个中断。
  • 一方面,中断控制器把一个编号放在地址总线上,这个编号指明是哪一个设备发出的中断请求。另一方面,它会向CPU发出一个中断信号。
  • 然后,CPU就会中断当前的工作,并且用这个编号作为索引去访问一个中断向量表。在这个向量表里存放的是中断处理程序的起始地址,这样就能跳转到该程序执行了,中断程序是对刚才的I/O操作的继续执行
  • 当中断处理程序运行不久后,就向中断控制器发出一个确认信号,表示这个中断已经被处理。这时,中断控制器就可以发出新的中断请求了。

2.3直接内存访问方式

  • 在中断驱动方式中,每一次的数据读写都是通过CPU来完成的,而且每次处理的数据量很少,因此中断的次数就很多,中断需要额外的系统开销,因此会浪费CPU的时间。
  • I/O操作一般分为两个阶段。第一个阶段是CPU或内存与设备控制器之间的通信。第二个阶段是设备控制器与I/O设备之间的通信。
如果是一次 写操作,那么在I/O操作启动时,CPU需要把数据从内存中写入到设备控制器内部的缓冲区,然后设备控制器自己去和I/O设备打交道,把这些数据写到设备上。
如果是一次 读操作,CPU先给控制器发信号,让它去启动I/O操作,把数据读入到控制器内部的缓冲区中,然后CPU再把这些数据读入到内存中。

每次只能传送一个字节或一个字,因此如果交换的数据量比较大,就会浪费大量的CPU时间。解决方法是:采用直接内存访问(Direct Memory Access,DMA)的控制方式,采用硬件的方式来实现I/O数据的移动。


不使用DMA方式,而是使用中断驱动的控制方式,来实现从磁盘上读取一个数据块:

  • CPU向磁盘控制器发出命令,读取一个数据块。(由CPU执行)
  • 磁盘控制器从磁盘驱动器中一位接着一位地读取这个数据块,一直到整个数据块都保存在控制器内部的缓冲区中。(硬件完成)
  • 磁盘控制器通过校验位来验证这个数据块是否传送正确,如果正确,就向CPU发出一个中断。(硬件完成)
  • 当操作系统执行一个循环,从控制器的数据寄存器中,读取一个字节保存在内存中。(由CPU执行)

如果使用DMA控制器硬件来完成第四步,则CPU会省出更多的时间去执行其它的进程。

下面介绍使用DMA控制器以后,从磁盘上读取一个数据块的过程:

  • CPU对DMA控制器进行编程,对它的各个寄存器的值进行设置,告诉它应该把数据传送到内存的什么地方。然后DMA向磁盘控制器发出命令,让它从磁盘中读取数据保存在自己的数据缓冲区中。
  • DMA控制器通过总线向磁盘控制器发出一个读操作的请求信号,并且把将要写入的内存地址打在总线上。
  • 磁盘控制器从内部缓冲区中取出一个字节,按照DMA控制器给的地址写入到内存中。
  • 当这个写操作完成之后,磁盘控制器让DMA发出一个确认信号。然后DMA控制器就会把内存地址加1,把需要传送的字节数减1,就转到第二步继续执行。
  • 当所有的数据传送完毕之后,DMA控制器就向CPU发出一个中断,告诉它数据传输已经完成。这样当中断处理程序开始运行时,它就知道,从磁盘中读出来的数据块已经在DMA的控制下,被传送到了内存中。也就是说,当中断发生时,这个I/O操作也完成了。

猜你喜欢

转载自blog.csdn.net/yaoxiaokui/article/details/43225929