Loading... ## 基本概念 ### 现代计算机的结构 ![image-20241010115318575.png][1] I/O 设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备。 ### 外部设备 #### 字符显示器 **显示字符的方法以点阵为基础**。点阵是指由 m×n 个点组成的阵列。点阵的多少取决于显示字符的质量和字符窗口的大小。字符窗口是指每个字符在屏幕上所占的点数,它包括字符显示点阵和字符间隔。 将点阵存入由 ROM 构成的字符发生器中,在 CRT 进行光栅扫描的过程中,从字符发生器中依次读出某个字符的点阵,按照点阵中 0 和 1 代码不同控制扫描电子束的开或关,从而在屏幕上显示出字符。对应于每个字符窗口,所需显示字符的 ASCII 代码被存放在视频存储器 VRAM 中,以备刷新。 #### 显示器参数 - 屏幕大小:以对角线长度表示,常用的有 12~29 英寸等。 - 分辨率:所能表示的像素个数,屏幕上的每一个光点就是一个像素,以宽、高的像素的乘积表示,例如,800×600、1024×768 和 1280×1024 等。 - 灰度级:灰度级是指黑白显示器中所显示的像素点的亮暗差别,在彩色显示器中则表现为颜色的不同,灰度级越多,图像层次越清楚逼真,典型的有8位 (256级)、16位等。n 位可以表示 $2^n$ 种不同的亮度或颜色。 - 刷新:光点只能保持极短的时间便会消失,为此必须在光点消失之前再重新扫描显示一遍,这个过程称为刷新。 - 刷新频率:单位时间内扫描整个屏幕内容的次数,按照人的视觉生理,刷新频率大于 30Hz 时才不会感到闪烁,通常显示器刷新频率在 60~120Hz 。 - 显示存储器 (VRAM) :也称刷新存储器,为了不断提高刷新图像的信号,必须把一帧图像信息存储在刷新存储器中。其存储容量由图像分辨率和灰度级决定,分辨率越高,灰度级越多,刷新存储器容量越大。 > 显存的理论最小值为一帧的大小。 $$ VRAM容量 = 分辨率 \times 灰度级位数 \\ VRAM带宽 = 分辨率 \times 灰度级位数 \times 帧频 $$ #### 小结 ![image-20241010132358759.png][2] ### I/O 系统基本组成 一般来说,I/O系统由I/O软件和I/O硬件两部分构成。 - I/O 硬件:包括外部设备、I/O 接口、I/O 总线等。 ![image-20241010130606003.png][3] - I/O 软件:包括驱动程序、用户程序、管理程序、升级补丁等。 通常采用 I/O 指令和通道指令实现主机和 I/O 设备的信息交换。 1. I/O 指令:CPU 指令的一部分 ![image-20241010130714400.png][4] > **I/O 指令与普通指令格式**略有**不同**, 操作码指明了 CPU 要对 IO 接口做什么,命令码指明了 IO 接口要对设备做什么。 2. 通道指令:通道能识别的指令 通道程序提前编制好放在主存中的。在含有通道的计算机中,CPU 执行 I/O 指令对通道发出命令,由通道执行一系列通道指令,代替 CPU 对 I/O 设备进行管理。 ### 主机与 I/O 设备的交互 I/O 接口:又称 I/O 控制器 (I/O Controller) 、设备控制器,负责协调主机与外部设备之间的数据传输。 I/O 控制器多种多样,也会制定相应的标准,如:用于控制 USB 设备的 IO 接口、用于控制 SATA3.0 硬盘的 IO 接口等。( I/O 控制器就是一块芯片,常被集成在主板上) ## I/O 接口 ![image-20241010125115733.png][5] > 数据流:键盘 $\rightarrow$ IO 接口的数据寄存器 $\rightarrow$ 数据总线 $\rightarrow$ CPU 寄存器 $\rightarrow$ 主存。 ### I/O 接口的作用 - 数据缓冲:通过数据缓冲寄存器 (DBR) 达到主机和外设工作速度的匹配。 - 错误或状态监测:通过状态寄存器反馈设备的各种错误、状态信息,供 CPU 查用。 - 控制和定时:接收从控制总线发来的控制信号、时钟信号。 - 数据格式转换:串-并、并-串等格式转换。 - 与主机和设备通信:实现主机—I/O接口—I/O设备之间的通信。 ### 工作原理 1. 发命令:发送**命令字**到 I/O 控制寄存器,向设备发送命令。 (需要驱动程序的协助) 2. 读状态:从状态寄存器读取**状态字**,获得设备或 I/O 控制器的状态信息。 3. 读/写数据:从数据缓冲寄存器发送或读取数据,完成主机与外设的数据交换。 ![image-20241010163628886.png][6] - 主机侧与系统总线相连,实质上是与内存、CPU相连。现代的数据传输方式可以是并行 (2000 年以前都是并行) ,也可以是串行。 - 设备测通过接口电缆与外设相连,外部接口的数据传输可能是串行方式,因此 I/O 接口需具有串/并转换功能。 - 控制寄存器,状态寄存器在使用时间上是错开的,因此有的 I/O 接口中将两者合二为一。 - I/O 控制器中的各种寄存器称为 **I/O 端口**。 ### 接口与端口 I/O 端口是指接口电路中可以被 CPU 直接访问的寄存器。I/O 端口要想能够被 CPU 访问,必须要有端口地址,每一 个端口都对应着一个端口地址。 ![image-20241010164115578.png][7] ### 端口编址 #### 统一编址 把 I/O 端口当做存储器的单元进行地址分配,用统一的访存指令 就可以访问 I/O 端口,又称**存储器映射方式**。 ![image-20241010164650969.png][8] 靠不同的地址码区分内存和 I/O 设备,I/O 地址要求相对固定在地址的某部分。 **优点**: - 不需要专门的输入/输出指令,所有访存指令都可直接访问端口,程序设计灵活度高。 - 端口有较大的编址空间。 - 读写控制逻辑电路简单。 **缺点**: - 端口占用了主存地址空间,使主存地址空间变小。 - 外设寻址时间长 (地址位数多,地址译码速度慢) 。 #### 独立编址 I/O 端口地址与存储器地址无关,独立编址。CPU 需要设置专门的输入/输出指令访问端口,又称 **I/O 映射方式**。 ![image-20241010164642115.png][9] 靠不同的指令区分内存和 I/O 设备,只能用专门的 I/O 指令访问 I/O 端口。 **优点**: - 使用专用 I/O 指令,程序编制清晰。 - I/O 端口地址位数少,地址译码速度快。 - I/O 端口的地址不占用主存地址空间。 **缺点**: - I/O 指令类型少,一般只能对端口进行传送操作,程序设计灵活性差。 - 需要 CPU 提供存储器读/写、I/O 设备读/写两组控制信号,增加了控制逻辑电路的复杂性。 ### I/O 接口的类型 按**数据传送方式**可分为: - 并行接口 :一个字节或一个字所有位同时传送。 - 串行接口 :一位一位地传送。 按**主机访问 I/O 设备的控制方式**可分为: - 程序查询接口 - 中断接口 - DMA 接口 按**功能选择的灵活性**可分为: - 可编程接口 - 不可编程接口 ### 小结 ![image-20241010165324017.png][10] ## 中断系统 ### 总览 ![image-20241010232512866.png][11] ### 基本概念 **程序中断**是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU **暂时中止现行程序**,而转去对这些异常情况或特殊请求进行处理。在处理完毕后 CPU 又**自动返回到现行程序**的断点处,继续执行原程序。 ![image-20241010233048286.png][12] 工作流程: 1. **中断请求** 中断源向 CPU 发送中断请求信号。 2. **中断响应** 想用中断的条件。此时可能需要进行**中断判优**,即多个中断源同时提出请求时通过中断判优逻辑相应一个中断源。 3. **中断处理** 通过**中断隐指令**将 CPU 执行流转移到**中断服务程序**。 对于**外中断**,CPU 是在统一的时刻即每条指令执行阶段结束前向接口发出中断查询信号,以获取 I/O 的中断请求,也就是说,CPU 响应中断的时间是在每条指令执行阶段的结束时刻。 CPU 响应中断必须满足以下3个条件: 1. 中断源有中断请求。 2. CPU允许中断即开中断。 3. 一条指令执行完毕,且没有更紧迫的任务。 ### 中断请求 #### 分类 ![image-20241010235823871.png][13] #### 中断请求标记 每个中断源向 CPU 发出中断请求的时间是随机的。为了记录中断事件并区分不同的中断源,终端系统需对每个中断源设置**中断请求标记触发器 INTR** 。当其状态为 "1" 时,表示中断源有请求。 这些触发器可组成中断请求标记寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。 ![image-20241011000527964.png][14] ### 中断判优 > 有多个中断信号同时到来,先处理哪个? 中断判优既可以用硬件实现,也可用软件实现: - 硬件实现是通过**硬件排队器**实现的,它既可以设置在CPU中,也可以分散在各个中断源中; > 下面的电路不会考 ![image-20241011001229377.png][15] - 软件实现是通过**查询程序**实现的。 ![image-20241011001315116.png][16] **优先级设置**:下面是常见的优先级设置 1. 硬件故障中断属于最高级,其次是软件中断; 2. 非屏蔽中断优于可屏蔽中断; 3. DMA 请求优于 I/O 设备传送的中断请求 4. 高速设备优于低速设备; 5. 输入设备优于输出设备; 6. 实时设备优于普通设备。 ### 中断处理 #### 中断隐指令 > 中断隐指令不是一条具体的指令,而是 CPU 在检测到中断请求时自动完成的一系列动作。 中断隐指令的主要任务: 1. **关中断**。在中断服务程序中,为了保护中断现场 (即 CPU 主要寄存器中的内容) 期间不被新的中断所打断,必须关中断,从而保证被中断的程序在中断服务程序执行完毕之后能接着正确地执行下去。 2. **保存断点**。为了保证在中断服务程序执行完毕后能正确地返回到原来的程序,必须将原来程序的断点 (即程序计数器 PC 的内容) 保存起来。可以存入堆栈,也可以存入指定单元。 3. **引出中断服务程序**。引出中断服务程序的实质就是取出中断服务程序的入口地址并传送给程序计数器 PC。 中断隐指令**确定中断服务程序的起始地址**有两种方法: - **软件查询法**。 - **硬件向量法**。 下面重点讲一下硬件向量法: 硬件向量法是由**硬件产生向量地址**,再由**向量地址**找到**入口地址**。 ![image-20241011003459287.png][17] - 为什么要使用向量而不直接获取中断服务程序的入口地址? 修改服务程序的时候可能会导致其长度发生变化。如果直接给出入口地址,那么每次变化就需要对硬件电路进行修改,灵活性差。 #### 中断服务程序 中断服务程序的主要任务: 1. **保护现场** 保存通用寄存器和状态寄存器的内容 (eg:保存 ACC 寄存器的值) ,以便返回原程序后可以恢复 CPU 环境。可使用堆栈,也可以使用特定存储单元。 2. **终端服务 (设备服务)** 主体部分,如通过程序控制需打印的字符代码送入打印机的缓冲存储器中 (eg:中断服务的过程 中有可能修改ACC寄存器的值) 3. **恢复现场** 通过出栈指令或取数指令把之前保存的信息送回寄存器中(eg:把原程序算到一般的 ACC 值恢复原样) 4. **中断返回** 通过中断返回指令回到原程序断点处。 ### 单重中断流程图 单重中断:执行中断服务程序时不响应新的中断请求。 ![image-20241011004548506.png][18] ### 多重中断 又称**中断嵌套**,执行中断服务程序时可响应新的中断请求。 ![image-20241011212512113.png][19] #### 中断屏蔽技术 中断屏蔽技术主要用于多重中断,CPU 要具备多重中断的功能,须满足下列条件: 1. 在中断服务程序中提前设置开中断指令。 2. 优先级别高的中断源有权中断优先级别低的中断源。 ![image-20241011212829966.png][20] 每个中断源都有一个屏蔽触发器,1 表示屏蔽该中断源的请求,0 表示可以正常申请,所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。 屏蔽字设置的规律: - 一般用 ‘1’ 表示屏蔽,’0’ 表示正常申请。 - 每个中断源对应一个屏蔽字 ( 在处理该中断源的中断服务程序时,屏蔽寄存器中的内容为该中断源对应的屏蔽字 ) 。 - 屏蔽字中 ‘1’ 越多,优先级越高。每个屏蔽字中至少有一个 ’1’ (至少要能屏蔽自身的中断) 。 ### 小结 ![image-20241011213712976.png][21] ## I/O 控制方式 CPU 控制 I/O 的完成有下面几种方法: ### 程序查询方式 CPU 不断轮询检查 I/O 控制器中的 “状态寄存器” ,检测到状态为 “已完成” 之后,再从数据寄存器取出输入数据。 ![image-20241010125426575.png][22] CPU 一旦启动 I/O ,必须停止现行程序的运行,并在现行程序中插入一端程序。 - 独占查询:CPU 100% 的时间都在查询 I/O 状态,完全串行。 - 定时查询:在保证数据不丢失的情况下,每隔一段时间CPU就查询一次 I/O 状态。查询的间隔内 CPU 可以执行其他程序。 **流程图**: ![image-20241010202945931.png][23] - **主要特点**:CPU 有 "他不" 等待现象,CPU 与 I/O 串行工作。 - **优点**:接口设计简单,设备量少。 - **缺点**:CPU 在信息传送过程中要花费很多时间用于查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低。 ### 程序中断方式 等待键盘 I/O 时 CPU 可以先去执行其他程序,键盘 I/O 完成后 I/O 控制器向 CPU 发出中断请求,CPU 响应中断请求,并取走输入数据。 ![image-20241010125445188.png][24] > 如果中断请求过多,会导致 CPU 花费大量时间来处理中断服务程序,CPU 利用率严重下降。 ![image-20241011214626265.png][25] ### DMA 控制方式 主存与高速 I/O 设备之间有一条**直接数据通路** ( DMA 总线) 。CPU 向 DMA 接口发出 “读/写” 命令,并指明主存地址、磁盘地址、读写数据量等参数。 ![image-20241010125731152.png][26] DMA 控制器自动控制磁盘与主存的数据读写,每完成一整块数据读写 (如1KB为一整块) ,才向 CPU 发出一次中断请求。 #### DMA 控制器 运行过程中 CPU 需要向 DMA 控制器指明要输入还是输出;要传送多少个数据;数据在主存、外设中的地址。 ![image-20241012141035831.png][27] 1. 接受外设发出的DMA请求 (外设传送一个字的请求) ,并向 CPU 发出总线请求。 2. CPU 响应此总线请求,发出总线响应信号,接管总线控制权,进入 DMA 操作周期。 3. 确定传送数据的主存单元地址及长度,并能自动修改主存地址计数和传送长度计数。 4. 规定数据在主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作。 5. 向 CPU 报告 DMA 操作的结束。 DMA 控制器详细的图如下: ![image-20241012141628520.png][28] > 在 DMA 传送过程中,DMA 控制器将接管 CPU 的地址总线、数据总线和控制总线,CPU 的主存控制信号被禁止使用。而当 DMA 传送结束后,将恢复CPU的一切权利并开始执行其操作。 #### DMA 传送过程 ![image-20241012142514830.png][29] ![image-20241012142024546.png][30] 主存和 DMA 控制器之间有一条数据通路,因此主存和 I/O 设备之间交换信息时,不通过 CPU 。但当I/O设备和 CPU 同时访问主存时,可能发生冲突,为了有效地使用主存,DMA 控制器与 CPU 通常采用以下 3 种方法使用主存: 1. 停止 CPU 访问主存。 ![image-20241012142714218.png][31] - 优点:控制简单。 - 缺点:CPU 可能长时间处于不工作状态或保持状态,不能充分发挥 CPU 对主存的利用率。 2. DMA 与 CPU 交替访存。 ![image-20241012142905188.png][32] - 优点:不需要总线使用权的申请,建立和归还过程。 - 缺点:硬件逻辑更为复杂。 3. 周期挪用 (周期窃取) 。 ![image-20241012143108701.png][33] DMA 访问主存的时候有三种可能: - CPU 此时不访存 (不冲突) - CPU 正在访存 (存取周期结束让出总线) - CPU 与 DMA 同时请求访存 (**I/O 访存优先**) #### DMA 方式的特点 1. 它使主存与 CPU 的固定联系脱钩,主存既可被 CPU 访问,又可被外设访问。 2. 在数据块传送时,主存地址的确定、传送数据的计数等都由硬件电路直接实现。 3. 主存中要开辟专用缓冲区,及时供给和接收外设的数据。 4. DMA 传送速度快,CPU 和外设并行工作,提高了系统效率。 5. DMA 在传送开始前要通过程序进行预处理,结束后要通过中断方式进行后处理。 #### 与程序中断方式对比 | | 中断 | DMA | | :------: | :---------------------------------------------------: | :-------------------------------------------------: | | 数据传送 | 程序控制<br />程序的切换 $\rightarrow$ 保存和恢复现场 | 硬件控制<br />CPU 只需要进行预处理和后处理 | | 中断请求 | 传送数据 | 后处理 | | 响应 | 指令执行周期接收后响应中断 | 每个机器周期结束均可以,总线空闲时即可响应 DMA 请求 | | 场景 | CPU 控制,低速设备 | DMA 控制器控制,高速设备 | | 优先级 | 优先级低于 DMA | 优先级高于中断 | | 异常处理 | 能处理异常事件 | 仅传送数据 | #### 小结 ![image-20241012143931427.png][34] ### 通道控制方式 有的商用中型机、大型机可能会接上超多的 I/O 设备,如果都让 CPU 来管理,那么会大量占用 CPU ,挤占 CPU 执行其他复杂指令的时间。 通道是具有特殊功能的处理器,能对 I/O 设备进行统一管理。通道可以识别并执行一系列**通道指令**,通道指令种类、功能通常比较单一。 ![image-20241010130254276.png][35] [1]: https://blog.domineto.top/usr/uploads/2024/10/3128602813.png [2]: https://blog.domineto.top/usr/uploads/2024/10/4236231466.png [3]: https://blog.domineto.top/usr/uploads/2024/10/1042012339.png [4]: https://blog.domineto.top/usr/uploads/2024/10/2615105281.png [5]: https://blog.domineto.top/usr/uploads/2024/10/146951849.png [6]: https://blog.domineto.top/usr/uploads/2024/10/608711762.png [7]: https://blog.domineto.top/usr/uploads/2024/10/149933361.png [8]: https://blog.domineto.top/usr/uploads/2024/10/1331259698.png [9]: https://blog.domineto.top/usr/uploads/2024/10/2025219341.png [10]: https://blog.domineto.top/usr/uploads/2024/10/1606405837.png [11]: https://blog.domineto.top/usr/uploads/2024/10/3475928114.png [12]: https://blog.domineto.top/usr/uploads/2024/10/1568312692.png [13]: https://blog.domineto.top/usr/uploads/2024/10/1979347515.png [14]: https://blog.domineto.top/usr/uploads/2024/10/2530680282.png [15]: https://blog.domineto.top/usr/uploads/2024/10/716297730.png [16]: https://blog.domineto.top/usr/uploads/2024/10/4276120525.png [17]: https://blog.domineto.top/usr/uploads/2024/10/3030447013.png [18]: https://blog.domineto.top/usr/uploads/2024/10/660890045.png [19]: https://blog.domineto.top/usr/uploads/2024/10/3505853307.png [20]: https://blog.domineto.top/usr/uploads/2024/10/3529495855.png [21]: https://blog.domineto.top/usr/uploads/2024/10/3098593006.png [22]: https://blog.domineto.top/usr/uploads/2024/10/645242016.png [23]: https://blog.domineto.top/usr/uploads/2024/10/4160989608.png [24]: https://blog.domineto.top/usr/uploads/2024/10/947405808.png [25]: https://blog.domineto.top/usr/uploads/2024/10/2617601355.png [26]: https://blog.domineto.top/usr/uploads/2024/10/2504150977.png [27]: https://blog.domineto.top/usr/uploads/2024/10/3968715868.png [28]: https://blog.domineto.top/usr/uploads/2024/10/702781661.png [29]: https://blog.domineto.top/usr/uploads/2024/10/2156746333.png [30]: https://blog.domineto.top/usr/uploads/2024/10/2740158901.png [31]: https://blog.domineto.top/usr/uploads/2024/10/45546055.png [32]: https://blog.domineto.top/usr/uploads/2024/10/3980942238.png [33]: https://blog.domineto.top/usr/uploads/2024/10/4104214940.png [34]: https://blog.domineto.top/usr/uploads/2024/10/1901797569.png [35]: https://blog.domineto.top/usr/uploads/2024/10/1520703934.png 最后修改:2024 年 10 月 12 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏