【README】
1.本文总结自B站 《
计算机组成原理
(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;
【1】 IO概述
【1.1】输入输出系统的发展概况
通道(通道是netty的io多路复用的底层原理,需要重点了解):
-
可以看做是一个小型的功能更强的DMA控制器
;能够执行通道程序,具有自己的指令系统; 通过执行通道程序,可以连接通道上的IO设备与主机直接联系;
【1.2】输入输出系统组成
1)IO指令
- 操作码:类似于标志,标识该条指令为IO指令;
- 命令码:io命令,表示对io设备做什么操作;
- 设备码:io设备地址,或io设备中的寄存器地址(io端口);
3)通道:
-
小型DMA处理器; 能够实现IO设备与CPU间的信息传送;通道有自己的控制器,存储器; 通道执行通道指令;
通道下面可以连多个子通道;
每个子通道可以连接设备控制器;每个设备控制器还可以连接多个设备;
硬件:
- 设备通过接口连接到总线上,和cpu完成信息交换;
- 如果是通道的话,那设备连接设备控制器,设备控制器连接通道,通道连接子通道;
【1.3】 IO设备与主机的联系方式
统一编址: io设备地址,看做是内存地址的一部分;
4)联络方式:
方式1:
立即响应,如led灯;
方式2:
异步工作采用应答信号;
Cpu与IO接口间采用并行传输;步骤如下(输出):
- 步骤1:io接口(端口)把数据准备好了后,就发送 ready信号通知io设备说数据准备好;
- 步骤2: io设备接收到信号后,从io接口中读取数据并给出应答信号(strobe-闪光或选通脉冲);
-
若是
输入
的话,则 IO接口(端口)的缓冲器一旦空了,则发送ready信号给io设备;io设备收到信号后,发送数据给io端口,并发送应答信号(strobe);io端口把数据传输给cpu;
方式3: 同步工作采用同步时标:
- 某时间点,必须开始某项工作;
- 某时间点,必须结束某项工作;
5)IO设备与主机的连接方式
连接方式1:
-
辐射式连接 == 分散连接; 即增加一个外设,主机或cpu就会增加一套io控制线路;
成本非常高
;
连接方式2:
- 总线连接;可移植性高;
【1.4】IO设备与主机信息传送的控制方式(非常重要*)
-
程序查询方式:
cpu与外设
采用串
行方式工作 ; -
程序中断方式:
cpu与IO设备
采用部分并行
工作; -
DMA方式:
把cpu进一步从数据输入输出中解放出来,使得外部设备和内存间可以直接建立连接,由
DMA控制器
或DMA接口直接控制 外部设备与内存间的数据交换 ;
1)程序查询方式:
在等待过程中,cpu处于原地踏步等待状态;大致过程为:
- cpu向外设发请求读取数据;
-
外设准备好数据后通知cpu取数据(在外设准备数据期间,cpu一直等待)
; - cpu取数据到自身寄存器;
-
cpu把寄存器的数据写入内存;(
但在外设准备数据的时候,cpu一直在等待,造成cpu效率非常低下
);
尽管cpu比较快,但外设准备数据比较慢;
2)程序中断方式:
2.0)对程序查询方式进行改进:
- 在io设备在准备数据时,cpu不会等待(不查询);
- 只有当外部设备与内存间开始进行信息交换的时候,cpu才会暂停现行程序;然后为输入输出进行服务;
2.1)中断方式过程:
- Cpu 发出启动io设备指令后, cpu继续执行原来的程序;
-
Io设备接收到输入或输出操作命令,然后开始准备数据;(期间cpu没有等待)
- 当io设备准备好接收数据或读取的数据后;
-
io设备向cpu提出一个中断请求;
- 让cpu停止当前程序的执行; 转而和io设备进行数据交换;
2.2)上图中表示:
- cpu执行第k条指令过程中,收到了外部设备已经准备好的中断请求信号;
- cpu执行完第k条指令后,把程序现场(K+1条指令地址)保存;(注意,cpu必须是执行完第k条指令后才响应中断)
- 然后跳转到中断服务程序;通过跳转到中断服务程序来完成数据的输入输出操作;
- 执行完中断服务程序后,又回到之前的程序现场继续执行(执行K+1条指令);
2.3 在整个过程中,在外设准备阶段,cpu没有踏步等待;
-
这种方式可以使得 cpu与io部分的并行工作
(cpu没有参与外设准备阶段,但参与了数据传输);
2.4)缺点
:
-
因为cpu保存程序现场,恢复程序现场是需要执行额外指令的,比如10几条指令;
如果传输的数据量非常小,如1个字节,耗费的成本是多执行10几条保存与恢复现场指令,那么cpu利用率就不高
;
2.5)小结
上述两种方式的数据io都需要cpu来参与; cpu架起了 外设与内存间的信息传输的桥梁;
能不能不经过cpu来进行数据传输,这就引入了DMA
;
3)DMA方式
3.0)dma方式简介:
- 内存与io设备之间通过DMA控制器进行数据交换, 完全不需要cpu的参与,不需要程序中断;
- 但DMA控制器需要用到 地址总线,数据总线,控制总线;
-
如果DMA使用了以上总线,则cpu需要让出这些总线控制权给DMA控制器(
周期挪用
的意思)
;
3.1) dma方式过程
- 步骤1:Cpu执行主程序,在主程序中,碰到了io指令;
- 步骤2:Cpu发出启动io指令;cpu继续执行自己操作;
- 步骤3:Io设备在dma控制器的控制下完成数据准备;
-
步骤4:当数据准备好以后,
由DMA控制器发出DMA请求,占用总线使用权
;占用一个存取周期,利用这个周期实现 外设与内存间的数据交换;
3.2)缺点:
在这个存取周期中,cpu无法使用总线,无法访问内存
;
3.3)但是
:
-
现代cpu并不是每执行一条指令就取一条指令,
指令是可以预取的
; - 在指令执行之前,可能若干条指令已经被预取到指令缓存中了;
- 只要这些指令不需要访问内存;
- 那么cpu就可以利用指令缓存中的指令和数据缓存中的数据继续执行主程序中的指令;
-
那么在这一个存取周期中,cpu也是可以并行操作的;(
并行效率取决于指令是否访问内存
,
更加确切的说,cpu是否使用总线
,如不使用总线,则cpu执行指令,dma控制器利用总线完成数据io,两者相互独立不影响);
补充:通道结构方式,IO处理机方式,参考其他材料;
三种方式下的cpu工作效率比较
在io数据传输场景下,推荐使用dma控制器方式进行io传输;
【2】 外部设备
【2.1】 概述
机机通信设备,如网卡;
【2.2】 输入设备
补充:键盘字母传输给cpu的过程
:
- 步骤1:把若干键排列成矩阵,用计数器经过行译码,列译码后,对键盘进行扫描;确定是哪个键被按下了;
- 步骤2:一旦扫描到被按下的键,则计数器可以停止;同时把计数器的输出作为 rom 的输入地址;这个rom就保存了键盘上每个键的 ascii 码; cpu通过中断方式可以读入这个ascii码;
- 步骤3:cpu读入指令,经过一段时间延迟后,可以输入到中断控制装置来清除中断标记;可以用于再一次启动计数器,使计数器可以再一次对键盘进行扫描;为下一个字符的输入做准备;
【2.3】输出设备
【2.4】其他
【3】 IO 接口
【3.1】 IO接口概述
为什么要设置接口(端口,或编址为内存地址或其他地址)?
- 1)采用总线来连接外部设备与cpu;cpu通过地址来确认是和哪个设备传输;接口有地址(端口),可以实现设备选择;
- 2)接口实现数据缓冲; 不同外设速度不同,如硬盘快,但键盘慢;
- 3)Cpu与接口间采用并行传输,一次传输1个字或1个字节;但接口与外部设备间可能采用串行传输,一个bit一个bit的传;数据要在接口当中完成组装或拆解,以便做格式转换;
- 4)电平转换: cpu与外部设备工作的电平不一致,需要接口来完成转换;
- 5)传送控制命令:cpu把控制命令传输到接口,由控制命令来控制外设来工作 ;
- 6)接口中有一些状态标志,用于标识外设是忙,还是闲; 外部设备是否有中断请求 ?
【3.2】接口的功能和组成
1)总线包括:
- 设备选择线(设备地址或端口地址);
- 数据线(完成数据的输入和输出);
- 命令线(cpu命令,控制外设);
- 状态线(反应外设是忙,还是准备,还是已完成);
2)外部设备接口的功能和组成
设备状态标记由一些列的触发器来完成。如下:
- 完成触发器 D;
- 工作触发器 B;
- 中断请求触发器INTR;(设备准备好以后,主动向cpu提出中断请求)
- 屏蔽触发器 MASK ;(接口可能有中断请求,但是否允许它向主机提出中断请求,要看设备中断请求的重要性,因此可以屏蔽中断请求)
- 如果 屏蔽触发器=1,那么尽管外设已经完成了工作,但仍然不能向cpu发出中断请求,因为cpu当前所处理工作的重要性比这次 io操作要高;
3)IO接口的基本组成
命令译码器:通过对命令译码,才知道cpu是要输入,还是输出还是其他操作;
【3.3】 接口类型
【4】 程序查询方式
详细内容参见
本文【1.4】程序查询方式
;
检查状态标记: 测试指令;
准备就绪: 转移指令;
交换数据: 传送指令; 输入输出指令;访存指令;
设置计数器的值: 要传送的字的个数;每传输一个字,就减1;
- 触发器B(BUSY信号):标记B为1,表示设备开始工作 ;设备处于忙的状态;
- 触发器D(READY信号):标记D为0,表示数据没有准备好;数据是否准备好的信号;数据准备好后,标记D设置为1;;
- DBR:数据缓冲寄存器;
【5】 程序中断方式
详细内容参见
本文【1.4】程序中断方式
;
1)中断定义
:
- cpu在执行程序过程中,如果发生意外事件,cpu要中断当前程序的执行转而处理意外事件;通过执行中断服务程序的方式来处理意外事件;
如: cpu在执行第k条指令的过程中,外设通过中断请求线向cpu发送中断请求;cpu在执行完第k条指令后,会去查询是否有中断请求;如果有,能不能进行响应; 如果可以响应,则cpu执行中断服务程序处理中断请求;
【5.1】中断的概念
【5.2】IO中断的产生
【5.3】 程序中断方式的接口电路
1)中断请求触发器:;
中断屏蔽触发器: ;
2)排队器:同一个时刻,向cpu发出中断请求的有多个设备
;需要对中断请求按照优先级进行排序;
3)中断向量地址形成部件:;
【排队器】
INTR1为1,则后面INTR(I,I>1)的为0;
确定了中断源之后, 下一步是找到中断服务程序的入口地址
;因为cpu是执行中断服务程序来处理意外事件(中断)的;
3)中断向量地址形成部件
:
中断号:
- 如8086cpu支持256个中断,那中断号可以编为0~255 ;
中断向量:
-
理解为中断服务程序的入口地址;
在x86cpu中,可以理解为中断服务程序的段地址和偏移量 组成的向量;也指程序状态字
; 如cpu发生中断时,一些非体系结构寄存器或程序状态寄存器,这些寄存器指令无法进行读取,那么就把它集成为一个字,这个字称为程序状态字;
向量地址:
- 中断向量所属指令所在的内存地址; 如中断服务程序的入口地址,所保存的内存单元地址;或跳转指令所在的内存地址;cpu通过跳转指令转到中断服务程序(这时,向量地址指的是跳转指令所在内存地址,跳转指令内部再保存了入口地址);如向量地址为 12H;存储的指令为 JMP 200 ;而200是入口地址;
4)程序中断方式接口电路的基本组成
【5.4】IO中断处理过程
地址线的设备选择信号和启动命令一并达到,才会启动外设接口;
【5.5】中断服务程序流程
2)多重中断:
- 表示的是中断嵌套;
- 即 cpu正在执行中断服务程序1; 这时,又有优先级更高的中断2产生;则cpu保存中断服务程序1的执行现场,然后转而执行中断服务程序2;这就叫嵌套;
3)单重中断和多重中断的服务程序流程
:
中断隐指令:
- 并不是一条实际指令,它指定的是中断处理的一系列指令的集合;
4)主程序和服务程序抢占CPU示意图
cpu响应中断过程如下:
- 步骤1:Cpu向io设备发送启动外设请求;
- 步骤2:io设备启动,准备数据;
- 步骤3:io设备准备好数据后,向cpu发送中断请求;
- 步骤4:cpu执行完指令后,查看是否存在中断请求;若有,则保存现场,转而执行中断服务程序;
- 步骤5:cpu执行完中断服务程序后,恢复程序现场,继续执行主程序;
【6】DMA方式(非常重要*)
详情可以参见
本文 【1.4】-dma方式
;
【6.1】DMA方式特点
1)DMA和程序中断两种方式的数据通路比较
1.11)引入DMA的背景
:
-
因为中断方式中,当io设备把数据准备好之后,cpu会响应io设备的中断请求;暂停执行主程序,保存现场,然后转而执行中断服务程序;
影响了主程序的执行效率
; - 所以io设备的数据传输还是会影响cpu的执行;
1.2)DMA不一样: 把cpu从io数据传输的过程中解放出来;
-
主存和io设备间的数据传输直接通过DMA控制器,而不是cpu;
- 但DMA控制器需要占用总线,而此时cpu不能使用总线,无法访问内存;
- 所以DMA还是会影响cpu的执行;(但cpu可以预取指令,如果执行的指令不访问内存或不使用总线,则影响比较小)
2)DMA与主存交换数据的三种方式 :
方式1: 停止cpu访问主存;
该方式的问题在于, DMA工作期间,cpu无法访问内存;
方式2:周期挪用
(推荐*);
方式3:
DMA与 CPU交替访问(不推荐,效率低)
:
DMA与cpu交替使用内存,但实用性不强;
【6.2】 DMA接口功能与组成
1)DMA 接口功能
:
- 步骤1:DMA向cpu申请总线和内存的控制权;
- 步骤2:总线和内存控制器的转交;
- 步骤3: 管理系统总线,控制数据传送; 是输入还是输出;
- 步骤4:;
- 步骤5:;
2)DMA 接口组成
:
2.1)寄存器列表
:
- 地址寄存器AR:给出传输数据的内存地址;
-
计数器:WC
,传输的数据量(word count); - 数据缓冲器:BR, buffer;
- 设备地址寄存器:DAR(把io设备地址保存在其中),供设备选择电路使用; 或当硬盘访问内存是,可以保持盘面好,磁柱,扇区号;
2.2)信号列表:
- DREQ:设备请求缩写;
- DACK:应答信号;
- HRQ: 总线请求信号;
- HLDA:总线应答信号;
2.3)中断机构
:
- 用于数据传输完成后,对后续工作进行处理; 如当WC=0,表示数据准备完成;
- WC就会向中断机构的中断触发器发送请求,表示数据准备完成;
- 再由中断机构向cpu发出中断请求;
【6.3】 DMA数据传输方式
1)DMA传送过程:
1.1)预处理:
1.2)DMA传送过程示意:
1.3)数据传送过程(输入 ) :
步骤列表(数据从外设送入到内存) :
- 步骤1: 外部设备把数据送入br 数据缓冲器;
- 步骤2: 外部设备向DMA控制器发送DREQ信号,说我已经把数据准备好了;
- 步骤3: DMA控制器向cpu发送 HRQ信号,申请占用总线请求;
- 步骤4: cpu在允许的情况下,会给出应答 HLDA,这时cpu会放弃对总线和内存的占用; 而总线和内存由DMA接口来控制;
- 步骤5: DMA接口中的AR寄存器把内存地址(目的地址)通过地址总线传给内存;
- 步骤6:DMA控制器给外设返回一个应答信号DACK,告诉外设数据传输可以开始了;
- 步骤7: DMA控制器发出读写控制指令,同时BR寄存器把数据送入到数据总线上,进而送入到AR寄存器指定的内存地址;
- 步骤8:每传输一个数据,AR内容加1(以便下一次传输使用加1后的地址);WC字计数器也加1;
- 步骤9:判断是否传输完成? 若没有完成,则继续传输下一个字;若完成,则WC的值发生溢出,溢出信号发送给中断机构,使得中断机构中的中断请求触发器设置为1,参加中断排队;然后发出中断请求;
- 步骤10:cpu接收到中断请求后,暂停当前出现执行,转而执行中断服务程序(以便进行后置处理);
1.4)数据传送过程(输出)
1.5)后处理
2)DMA接口与系统的连接方式
2.1)具有公共请求线的 DMA 请求
一台机器可以有多个DMA接口;多个DMA接口可以连接到总线上;
-
即,所有DMA接口共享一条DMA请求线
,连接到CPU;
2.2)独立的DMA请求
每个DMA接口都有独立的 请求和响应总线;
3)DMA方式与程序中断方式比较:
【6.4】 DMA接口的类型 (非常重要,netty中io多路复用底层原理)
【6.4.1】选择型
设备地址寄存器用于选择是哪个设备(是否当前设备)与主存进行连接;
一旦设置后, 只能有1个设备使用DMA接口
;
【6.4.2】 多路型
多路型的DMA接口应用到了通道-
io多路复用
技术上,如netty(非常重要)
;
- 但真正传输数据的时候,也只能有1个外设与内存进行数据传输;
- 逻辑上连接多个设备,指的是数据准备阶段,可以有多个设备同时进行数据准备;
以通道为例:
- 通道也是一个小型的DAM控制器,用的也是DMA接口;
-
1个通道包含多个子通道;
每个子通道有自己独立的寄存器,包括字计数器,地址寄存器,数据缓冲寄存器等
; - 多个外部设备对应不同的子通道,可以同时进行数据准备;如磁盘和磁带同时准备数据;
- 外部设备准备好了,通过子通道向通道提出数据传输请求;
-
在数据传输过程中,只能有一个外设与内存进行传输,即数据传输是串行的,但
数据准备可以并行同时进行
;
【6.4.3】多路型 DMA接口原理
据上图,我们看出:
-
一个多路型的通道,即便连接了多个外设,但在传输过程中,可以看出
通道还有很多个时间片是空闲状态; 还可以连接更多的外设
;