IO 输入/输出
IO 硬件设备
IO的硬件对于不同的人立即方式是不同的,对于电子工程师:IO硬件就是芯片,导线,电源,电机和其他组成硬件的物理部件;
对程序员而言:注意IO硬件提供给软件的接口,如硬件能够接受的命令,能够实现的功能以及它能够报告的错误
I/O设备
I/O设备大致可以分为两类:块设备(block device)和字符设备(character device)。
块设备的基本特征是每个块都能独立于其他块而读写。
字符设备以字符为单位发送或接收一个字符流,而不考虑任何块结构。
设备控制器
I/O设备一般由机械部件和电子部件两部分组成,通常两部分处理,电子部件称作位设备控制器(device controller)或者适配器(adapter),机械部件是设备本身。
控制器卡上通常有一个连接器,通向设备本身的电缆可以插入到这个连接器中。控制器与设备之间的接口通常是一个很低层次的接口。
控制器的任务是把串行的位流转换为字节块,并进行必要的错误校正工作。字节块通常首先在控制器内部的一个缓冲区中按位进行组装,然后在对校验和进行校验并证明字节块没有错误后,再将它复制到主存中。
内存映射I/O
每个控制器有几个寄存器用来与CPU进行通信:通过写入这些寄存器,操作系统可以命令设备发送数据、接收数据、开启或关闭,或者执行某些其他操作;通过读取这些寄存器,操作系统可以了解设备的状态,是否准备好接收一个新的命令等。
CPU与设备的控制寄存器和数据缓冲区进行通信的方法:
- 每个控制寄存器被分配一个I/O端口(I/O port)号,所有I/O端口形成I/O端口空间(I/O port space),并且受到保护使得普通的用户程序不能对其进行访问;
- 将所有控制寄存器映射到内存空间中,每个控制寄存器被分配唯一的一个内存地址,并且不会有内存被分配这一地址,这样的系统称为内存映射I/O(memory-mapped I/O),通常分配给控制寄存器的地址位于地址空间的顶端。
对于内存映射I/O,不需要汇编代码仅用C就可以寻址,不需要特殊的保护机制来阻止用户进程执行I/O操作(只要避免把包含控制寄存器的那部分地址空间放入任何用户的虚拟地址空间之中),而且可以引用内存的每一条指令也可以引用控制寄存器。
对于内存映射I/O,硬件必须针对每个页面具备选择性禁用高速缓存的能力 - 进行混合方案,这一方案具有内存映射IO的数据缓冲区,而控制寄存器则有单独的IO端口
直接存储器存取
无论一个CPU是否具有内存映射IO,他都需要寻址设备控制器以便于他们交换数据,CPU可以从IO控制器每次请求一个字节的数据,但是这样做浪费CPI的时间,所以我们可以用到直接存储器存取(direct Memory Access,DMA)的不同方案;
无论DMA控制器在物理上处于什么地方,他都能独立于CPU进行访问系统总线
DMA的工作流程:
- CPU通过设置DMA控制器的寄存器对它进行编程,所以DMA控制器知道将什么数据传送到什么地方;
- DMA控制器还要向磁盘控制器发出一个命令,通知它从磁盘读数据到其内部的缓冲区中,并且对校验和进行检验,DMA控制器通过在总线上发出一个读请求到磁盘控制器而发起DMA传送;
- 磁盘控制器逐字读取磁盘内部缓冲区中数据并写入内存中;
- 磁盘控制器在总线上发出一个应答信号到DMA控制器;
- DMA控制器将中断CPU以便让CPU知道传送现在已经完成了。
总线能够以两种模式操作:每次一字模式和块模式;
每次一字模式:DMA控制器请求传送一个字并且得到这个字,如果CPU也想使用总线,它必须等待,这一机制称为周期窃取(cycle stealing),因为设备控制器偶尔偷偷溜入并且从CPU偷走一个临时的总线周期,从而轻微地延迟CPU。
块模式:DMA控制器通知设备获得总线,发起一连串的传送,然后释放总线,这一操作形式称为突发模式(burst mode)。
**飞越模式(fly-by mode)**中,DMA控制器通知设备控制器直接将数据传送到主存。
在DMA可以开始之前磁盘首先要将数据读入其内部的缓冲区中的原因:
- 磁盘控制器可以在开始传送之前检验校验和;
- 总线很忙时,磁盘控制器来不及将数据读入内存中,则先暂存入磁盘内部的缓冲区中。
重温中断
在硬件层面,中断的工作流程:当IO设备完成交给它的工作时,他就产生一个中断(假设操作系统已经开放中断)