6.2 I/O设备和设备控制器
L34
学习目标
静态 HdfDeviceInfo;serviceName;统一 Read/Write/Dispatch。
- 官方用 HCS;本课用表。
- 与设备无关层=按名找服务。
- 缓冲平滑速度差。
- 本课串口暂可无复杂缓冲。
- TFT/RGB 列入应用阶段挂接。
- 电梯算法等属外存章。
- Bind:把 IO 服务挂到设备对象上,让上层能按名找到它。
- Init:真正初始化硬件;Bind 失败就不应 Init。
原理 · 深入理解
6.2 I/O设备和设备控制器
本节概览:先建立「I/O设备和设备控制器」的框架,再依次展开下列小节。
- I/O设备
- 设备控制器
- 内存映像I/O
- I/O通道
6.2.1 I/O设备
设备并不直接与CPU通信,而是与设备控制器通信,因此I/O设备中应含有与设备控制器间的接口,该接口有三种类型的信号,各对应一条信号线。
- 数据信号线:在设备和设备控制器之间传送数据
- 控制信号线:控制器向I/O设备发送控制信号的通路,规定设备要执行的操作
- 状态信号线:传送指示设备当前状态的信号
按传输速率可将I/O设备分为三类。
- 低速设备:每秒几个字节至数百字节,如键盘、鼠标器
- 中速设备:每秒数千字节至数十万字节,如激光打印机
- 高速设备:每秒数十万字节至千兆字节,如磁带机、光盘机
按用途可分为三类:存储设备(外存、辅存,用以存储信息)、输入设备(接收外部信息)、输出设备(将计算机处理后的结果输出);交互式设备则是上述两类的集成。
6.2.2 设备控制器
设备控制器位于CPU与设备之间,既要与CPU通信又要与设备通信,还应能按CPU命令控制设备工作。现有大多数控制器由以下三部分组成。
- 设备控制器与处理机的接口
- 设备控制器与设备的接口
- I/O逻辑
设备控制器的主要功能是控制一个或多个I/O设备,实现I/O设备与计算机之间的数据交换。它是CPU与I/O设备之间的接口,接收CPU发来的命令去控制I/O设备工作。
- 接收和识别命令
- 数据交换
- 标识和报告设备的状态
- 地址识别
- 数据缓冲区
- 差错控制
6.2.3 内存映像I/O
内存映像I/O方式在编址上不再区分内存单元地址和设备控制器寄存器地址,统一采用k。当k处于0~n-1范围时被认为是内存地址,k大于等于n时被认为是某控制器的寄存器地址。
例如将CPU寄存器内容传送到控制器0的第1个寄存器:Store cpu-reg,n。
内存映像I/O
在这种方式中,在编址上不再区分内存单元地址和设备控制器中的寄存器地址,都采用k。当k值处于0~n-1范围时,被认为是内存地址,若k大于等于n时,被认为是某个控制器的寄存器地址。
将CPU寄存器中的内容传送到控制器0的第1个寄存器opcode: Store cpu-reg,n。
6.2.4 I/O通道
由于通道价格昂贵,机器中设置的通道数量较少,往往使它成为I/O的瓶颈,进而造成整个系统吞吐量下降。
解决瓶颈问题最有效的方法是:增加设备到主机间的通路而不增加通道。
虽然在CPU与I/O设备之间增加了设备控制器后已能大大减少CPU对I/O的干预,但当主机配置的外设很多时CPU负担仍然很重。为此在CPU和设备控制器之间又增设了I/O通道。
I/O通道是一种特殊的处理机,具有执行I/O指令的能力,通过执行通道程序来控制I/O操作。它与一般处理机的主要区别如下:
- 指令类型单一
- 通道没有自己的内存
字节多路通道按字节交叉方式工作,通常含有几十到数百个非分配型子通道,每个子通道连接一台I/O设备并控制其操作,子通道按时间片轮转方式共享主通道。
字节多路通道不适于连接高速设备,推动了按数组方式传送的数组选择通道的形成。数组选择通道传输速率高但每次只允许一个设备传输数据。
数组多路通道结合了数组选择通道传输速率高和字节多路通道各子通道分时并行操作的优点。
- 字节多路通道(Byte Multiplexor Channel)
- 数组选择通道(Block Selector Channel)
- 数组多路通道(Block Multiplexor Channel)
由于通道价格昂贵,机器中通道数量少,常成为 I/O 的瓶颈,造成系统吞吐量下降。
解决“瓶颈”问题的最有效方法:增加设备到主机间的通路而不增加通道。
结合图 6-8 多通路 I/O 系统理解:通过多通路配置,一个设备可经多条通路访问,避免单通路成为瓶颈。
做 · 实验
- 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。
- 填写外设→module→service 表;交互动画预览寻道。
- 编译 HDF UART 实验,确认输出能表明走了服务而不是纯裸机路径。
- 对照裸机串口实验的日志,列出多出来的标识或调用层次。
- 烧录 08-hdf-uart,串口有课程标识行。
I/O设备和设备控制器
hdf-driver-entry
用控件单步操作;日志区记下每一步发生了什么。
代码导读
本课在工作台编译烧录。先读 user 实验入口,再对照 kernel / HDF 中被调用的函数,不要一上来改链接脚本。
总结与提升
- 能区分 moduleName 与 serviceName。
- 能用自己的话复述学习目标,并指出概念与板上实验的对应。
- 能说明双缓冲的好处。
- 映射表含 uart0、gpio,并预留 tft/rgb。
- 能默写 Bind/Init/Release 职责。
- 串口输出稳定,并能说明访问路径经过 HDF。
- 按下/松开有 HDF 日志。
- 能叙述中断处理大致步骤。
- 能指出 SOWL 至少一个外设的控制路径。
延伸思考
- 同一驱动多实例如何表示?
- 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?
- RGB 帧缓冲算哪类缓冲?
- 磁盘调度在 Flash 上还有意义吗?