从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • 计算机历史

  • 数字电路

  • 计算机组成原理

  • 汇编语言

  • C语言

  • 数据结构

  • 操作系统

    • 我的操作系统学习笔记

    • 我的操作系统实验笔记

    • 操作系统网课-王道考研

      • 0_课程白嫖指南
      • 1_1_操作系统的概念(定义)、功能和目标
      • 1_2_操作系统的特征
      • 1_3_操作系统的发展与分类
      • 1_4_操作系统的运行机制与体系结构
      • 1_5_中断和异常
      • 2_1_1_进程的定义、组成、组织方式、特征
      • 2_1_6_系统调用
      • 2_1_2_进程的状态与转换
      • 2_1_3_进程控制
      • 2_1_4_进程通信
      • 2_1_5_线程概念和多线程模型
      • 2_2_1_处理机调度的概念、层次
      • 2_2_2_进程调度的时机、切换与过程、方式
      • 2_2_3_调度算法的评价指标
      • 2_2_4_FCFS、SJF、HRRN调度算法
      • 2_2_5_调度算法:时间片轮转、优先级、多级反馈队列
      • 2_3_1_进程同步、进程互斥
      • 2_3_2_进程互斥的软件实现方法
      • 2_3_3_进程互斥的硬件实现方法
      • 2_3_4_信号量机制
      • 2_3_5_用信号量实现进程互斥、同步、前驱关系
      • 2_3_6_生产者-消费者问题
      • 2_3_7_多生产者-多消费者问题
      • 2_3_8_吸烟者问题
      • 2_3_9_读者-写者问题
      • 2_3_10_哲学家进餐问题
      • 2_3_11_管程
      • 2_4_1_死锁的概念(1)
      • 2_4_2_死锁的处理策略—预防死锁
      • 2_4_3_死锁的处理策略—避免死锁
      • 2_4_4_死锁的处理策略—检测和解除
      • 3_1_1_内存的基础知识
      • 3_1_2_内存管理的概念
      • 3_1_3_覆盖与交换
      • 3_1_4_连续分配管理方式
      • 3_1_5_动态分区分配算法
      • 3_1_6_基本分页存储管理的基本概念
      • 3_1_7_基本地址变换机构
      • 3_1_8_具有快表的地址变换机构
      • 3_1_9_两级页表
      • 43_3_1_10_基本分段存储管理方式
      • 3_1_11_段页式管理方式
      • 3_2_1_虚拟内存的基本概念
      • 3_2_2_请求分页管理方式
      • 3_2_3_页面置换算法
      • 3_2_4_页面分配策略
      • 4_1_1_初识文件管理
      • 4_1_2_文件的逻辑结构
      • 4_1_3_文件目录
      • 4_1_4_文件的物理结构(上)
      • 4_1_4_文件的物理结构(下)
      • 54_4_1_5_文件存储空间管理
      • 4_1_6_文件的基本操作
      • 4_1_7_文件共享
      • 4_1_8_文件保护
      • 4_1_9_文件系统的层次结构
      • 4_2_1_磁盘的结构
      • 4_2_2_磁盘调度算法
      • 4_2_3_减少磁盘延迟时间的方法
      • 4_2_4_磁盘的管理
      • 5_1.2_I-O控制器
        • lO控制器
        • IO控制器的组成
        • 内存映像IO vs 寄存器独立编制
        • 小结
      • 5_1.3_I-O控制方式
      • 65_5_1_1_I-O设备的概念和分类
      • 5_1_4_I-O软件层次结构
      • 5_1_5_I-O核心子系统
      • 5_1_6_假脱机技术
      • 5_1_7_设备的分配与回收
      • 5_1_8_缓冲区管理
    • 操作系统
  • Linux

  • 计算机网络

  • Git

  • 数据库

  • 计算机小知识

  • 编译原理

  • 名人堂

  • 计算机基础
  • 操作系统
  • 操作系统网课-王道考研
2023-05-15
目录

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个选项,‍‍所以其实如果我是出题老师的话,我也有可能会把这三个正确的‍‍答案再加上一个错误的选项,让大家选出错误的选项,所以大家也不要偷懒,对于控制器的组成主要功能,这些也需要有一个大体的印象。‍‍

​

在GitHub上编辑此页 (opens new window)
上次更新: 2023/5/16 10:03:43
4_2_4_磁盘的管理
5_1.3_I-O控制方式

← 4_2_4_磁盘的管理 5_1.3_I-O控制方式→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式