51.2I-O 控制器
# 5.1.2_I-O 控制器
各位同学大家好,在这个小节中我们会学习 lO 控制器相关的内容,学习了小节的内容之后,有助于我们理解之后的小节会讲解的 IO 控制方式。
IO 设备其实是由机械部件和电子部件组成的,电子部件就是我们开篇提到的所谓的 lO 控制器或者叫设备控制器
像我们平时使用的鼠标键盘,还有显示器当中我们看得见摸得着的这些机械的部分,所谓的机械部件,它这些机械部件主要用来执行具体的 IO 操作,比如说这个 LED 屏就是用来显示输出的那些图像数据的,所谓的电子部件一般来说就是一个印刷电路板,在操作系统这门课当中重点需要掌握的是电子部件相关的一些知识。
其实当我们的这些 IO 设备连上电脑之后,我们的 CPU 是没办法直接控制这些 lO 设备的机械部件的,它必须通过电子部件来间接的控制这些机械部件,
# lO 控制器
所以其实电子部件或者说 lO 控制器,它其实就是一个 CPU 和 lO 设备的机械部件之间的一个中介的作用,就像它的名字一样,lO 控制器其实就是用于实现 CPU 对 IO 设备的控制的, lO 控制器需要完成这样几个主要的功能,首先是要接收和识别 CPU 发出的命令,我们最熟悉最简单的命令当然就是读或者写的命令,除了命令本身之外,CPU 还会告诉 IO 控制器执行命令相关的一些参数,比如说要读多少个字节,要写多少个字节,因此 lO 控制器当中需要设置一个叫做控制寄存器的东西,就是用来存放 CPU 发出的命令和参数的,之后 lO 控制器就可以根据寄存器当中存放的这些数据来确定自己要执行的到底是什么样一个操作了。
除了接收和识别 CPU 发出的命令之外,IO 控制器还需要能够向 CPU 报告设备的状态,比如说一个设备此时到底是忙碌的还是空闲的,还是说这个设备此时处于故障的状态, CPU 作为系统资源的管理者,当然也需要知道各个设备的相应的状态,所以 lO 控制器当中也会设置一个叫做状态寄存器的东西, CPU 可以读取寄存器当中的内容来判断一个 lO 设备此时的状态。比如说我们可以规定,1 是表示此时设备空闲,0 表示忙碌,当然如果还有其他更复杂的状态的话,我们可以用更多的而精之为来本来来表示。
第三个 lO 控制器需要实现的功能是数据交换,因为 lO 控制器它是 CPU 和 l 设备机械部件之间的中介,所以它作为中介当然也需要负责作为数据交换的中间的一个使者,所以在 l 控制器当中一般来说会设置相应的数据寄存器。如果数据要从主机输出到设备,那在输出数据的时候,这个数据寄存器就会用于暂时存放 CPU 发过来的数据,然后之后这个 lO 控制器又会把数据寄存器当中的内容再传送到设备,输入的时候数据的流向刚好是相反的,不过数据寄存器也是用于暂存着要输入的数据,之后 CPU 会从寄存器当中取走相应的数据,这就可以完成数据的交换的一个过程。
第四个 IO 控制器需要实现的功能叫做地址识别,我们通过之前的分析会发现 IO 控制器当中会设置各种各样的寄存器,并且每一种寄存器可能会有多个,为了识别这些寄存器,我们也需要像给内存编址一样,给各个寄存器编上一个相应的地址, CPU 在我往这些寄存器当中读或者写数据的时候,就是通过这些寄存器对应的地址来进行操作的。那 IO 控制器需要通过 CPU 提供的地址来判断此时 CPU 想要操作的到底是哪一个寄存器,所以 IO 控制器还需要实现一个地址识别的功能
# IO 控制器的组成
我们在了解了 IO 控制器的功能,还有各个功能大致需要怎么实现之后,我们来看一下 IO 控制器应该有哪些部分组成。一般来说 IO 控制器可以分为这样的三个部分,第一个部分是 CPU 与控制器的接口,第二个部分叫 IO 逻辑,第三个部分就是控制器与设备之间的接口。
还记得之前咱们说过的那句话吗?IO 控制器它其实是作为 CPU 和设备的机械部件之间的一个中介的关系,所以左边的这个部分其实就是中介与 CPU 连接的部分,也就是 CPU 与控制器的接口;右边的部分是中介和设备的机械部件进行连接的部分,也就是控制器与设备的接口;而这个中介在连接 CPU 和设备的时候,必然是需要做一些中间的处理的,这些处理主要就是在 IO 逻辑这个部分来完成的,所以 IO 逻辑他会负责接收和识别从 CPU 发过来的各种各样的命令。当然像咱们刚才提到的地址识别或者说地址译码也是 IO 逻辑需要进行的。
在接收和识别了 CPU 的命令之后,它还需要把它翻译成具体的设备能够明白的一些命令,然后通过控制器与设备之间的接口发送给具体的设备,让设备执行相应的操作。
这个地方大家会发现一个 IO 控制器它可能会有多个控制器与设备之间的接口,也就是说一个 IO 控制器有可能会负责控制多个具体的 IO 设备,为了区别 CPU 此时要操作的到底是哪一个设备,
同样需要给这些设备进行一个编号,或者说给各个设备接口一个地址, CPU 在发出 IO 命令的时候,也需要指明自己需要操纵的是哪一个设备
我们来捋一捋中间的过程。CPU 首先会通过也一个叫做控制线的线路,向 IO 控制器发出一个具体的 IO 指令,同时 CPU 还会在地址线这样的一个线路上说明自己要操纵的是哪一个设备。如果说此时是要输出一个数据的话, CPU 会通过数据总线把自己要输出的数据放到 IO 控制器的数据寄存器当中,那之后 IO 逻辑就可以从数据寄存器当中取得 CPU 想要输出的数据,类似的 CPU 此时发出的 IO 指令可能会有一些相应的参数,这些参数它会放到控制寄存器当中, IO 逻辑就可以从控制寄存器当中读出相应的参数了。
另外为了实现对各个设备的管理,那么 CPU 还会从这个状态寄存器当中读出各个设备的一个状态,比如说忙碌空闲还是故障等等, IO 逻辑会往状态寄存器当中写入相应的数据,来告诉 CPU 各个设备的状态到底是什么样的,这就是 CPU 与控制器的接口所需要负责完成的一些事情。这个接口主要就是用于完成 CPU 和控制器之间的通信,
类似的控制器与设备的接口其实就是用于完成控制器和设备之间的一个通信。比如说此时是要输出一个数据的话,首先就是由 CPU 通过数据总线把数据写入到数据寄存器当中,然后 IO 逻辑取出数据寄存器当中的内容,然后通过右边这个接口数据通路把这些数据输出到外部设备上,
类似的如果要输入一个数据的话,这些数据可以通过接口输入,然后 IO 逻辑会把这些数据放到数据寄存器当中之后,CPU 又从数据寄存器当中取走数据,这就完成了一个数据输入的过程。
除了这样一个传送数据的通路之外,设备还需要及时的向 IO 控制器反馈自己的状态,比如说这个设备到底是忙碌还是空闲,同样的设备通过这个接口向 IO 控制器报告此时自己的状态,然后 IO 控制器的 IO 逻辑又会把这个设备的状态写入到它对应的状态寄存器当中。
最后这个接口中还会有一个用于实现设备控制的电路 IO 逻辑会根据 CPU 发出的命令,还有相应的参数,然后对应的设备发出一些控制命令,让这些设备执行具体的工作。
这就是 IO 控制器的一个组成,分为这样的三个部分,
这个地方有两个小细节比较值得注意。首先刚才咱们强调的一个 IO 控制器可能会对应多个设备,第二,由于控制器会对应多个设备,而各个设备需要输入输出的数据,还有各个设备的状态,这些肯定是不同的。所以如果这些设备同时工作的话,那么显然只设置一个数据寄存器,状态寄存器肯定是不能满足需求的,因此其实这些数据寄存器,控制寄存器、状态寄存器这些寄存器也会有多个,所以既然 IO 控制器中会有多个寄存器,为了识别各个寄存器,也需要给这些寄存器进行编制,这点咱们在之前也提到过。
一般来说给这些寄存器编制会有两种方式,第一种方式就是让他们占用内存地址的一部分,这种方式称作内存映像 IO,另一种方式就是会采用 IO 专用的地址,也就是寄存器独立的编制,
# 内存映像 IO vs 寄存器独立编制
我们来看一下它们的区别。如果采用的是内存映像 IO 这种方式的话,假设我们的内存总共有 n 个地址,它们的编号分别是 0 到 n 减 1,如果是系统中有一个设备控制器 0,它有三个对应的寄存器,这些寄存器就会顺着内存的地址继续往下编制,寄存器 0 的地址是 n,寄存器 1 的地址是 n 加 1,然后以此类推。假如说还有别的设备控制器,它也有控制寄存器的话相应的也是会把这些寄存器让它继续往下接着编制。
也就是说这些控制器当中的寄存器和内存采用的是统一的一个地址,如果采用的是寄存器独立编制的话,我们的内存是 0 到 n-1 这样一个地址范围。如果有一个设备控制器,它有三个寄存器,这些寄存器又会被从 0 开始进行编号,相应的如果还有别的控制器的话,它也是会从 0 开始编号,不过在有的系统当中也有可能是各个设备控制器当中的寄存器,用连续编号的方式,也就是说寄存器可能是编号为 3,寄存器是 4,寄存器是 5。当然我们并不需要纠结这些细节,我们只需要知道如果采用的是寄存器独立编制这种方案的话,那么这些寄存器和内存的地址空间并不是统一的,它们是两个独立的体系,采用这种方式有一个很明显的缺点,就是要设置一些专门的指令来实现对这些寄存器的存取操作。
像这个例子当中各个控制器的这些寄存器,他们的地址也都是相互独立的,在这种情况下,我们不仅要指明我们要操作的寄存器的编号,同时还需要说明到底要操作的是哪一个控制器,是控制起 0 还是控制器 1。而如果我们采用的是内存映像 IO 这种方式的话,那么我们就不需要设置专门的指令来支持对这些寄存器的操作,我们只需要用对内存单元的操作相同的那些指令来操作这些寄存器就可以了。这是这两种方式的一个区别,还有它们的优缺点。
# 小结
这个小节我们介绍了 IO 控制器,也就是 IO 设备的电子部件, IO 控制器就是用于实现对 IO 设备的控制的,随着计算机的发展也出现了很多种对 IO 设备的控制方式,这是咱们之后的小结会重点讲解的内容。
这个小节的内容考的频率并不是很高,但是大家也需要能有一个大致的印象,需要重点注意的是两种寄存器编制方式的区别,还有他们各自的优缺点。
当然 IO 控制器有 3 个部分组成,但是我们的选择题当中一般有 4 个选项,所以其实如果我是出题老师的话,我也有可能会把这三个正确的答案再加上一个错误的选项,让大家选出错误的选项,所以大家也不要偷懒,对于控制器的组成主要功能,这些也需要有一个大体的印象。