IO设备
IO设备大致可以分为两大类:块设备和字符设备。
其中块设备中的每一个块都可以独立于其他的块进行读写,而且每一个块都有自己的地址,支持随机访问,块设备的传输以一个块或多个连续的块为单位。如硬盘、磁盘、U盘。
字符设备以字符为单位发送或接受一个字符流,没有任何块结构,是不可寻址的,也没有任何寻道操作。如网络接口、鼠标。
IO设备一般由机械部件(设备本身)和电子部件(设备控制器)组成。
为了屏蔽具体设备的差异,每个设备都对应一个管理他们的硬件设备——设备控制器,设备控制器具有芯片和寄存器,可以与CPU进行通信。CPU通过读写控制器的寄存器与控制器进行通信。(CPU通过控制器间接控制IO设备)
控制器的任务就是把串行的位/比特流转换为字节流,并进行必要的错误校正工作。字节块首先达到控制器内部的缓冲区,并且按位组装,然后对校验和进行校验,并证明字节块没有错误后,再将它复制到主存中。
数据离开一个设备之后,通常并不能直接放到最终的目的地。【1】需要放到某个地方进行检查、校验【2】处理数据生产者与数据消费者之间速度不匹配的问题,消除缓冲区填满速度与清空速度之间的相互影响。
一旦磁盘传送开始工作,从磁盘读出的数据就是以固定速率到达的,不论控制器是否准备好接收数据,如果控制器要将数据直接写入内存,则必须为要传送的每个字取得系统总线的控制权,如果总线很慢则必须将数据临时存放在某个位置。
IO通信
每个控制器有多个寄存器与CPU进行通信,主要为以下四种:
【1】数据输入寄存器
【2】数据输出寄存器
【3】状态寄存器
【4】控制寄存器(用于下达命令)
CPU和设备的控制寄存器、数据缓冲区通信主要有两种方案:
【1】I/O端口空间
设备的控制寄存器都被分配了一个I/O端口号(一个整数值),所有的I/O端口组成一个I/O端口空间,这些值只能被操作系统访问。而且需要使用特殊的I/O指令。
例: in myRegister 88 这条指令,告诉CPU将读取88对应的控制寄存器的内容,存入CPU的寄存器myRegister中。out 88 myRegister 则是将寄存器myRegister的内容写入88对应的控制寄存器中。
这里,I/O端口空间和内存地址空间是不同的
【2】内存映射IO
将所有的控制寄存器映射到内存空间,每个控制寄存器分配唯一的内存地址,并且不会和内存地址空间的地址重合。
CPU读入一个地址时,无论来自内存还是IO端口,它将地址放入总线的地址线,然后在总线的控制线上声明一个read信号,还需要使用第二条信号线表明来自IO空间还是内存空间。这个地址将会落在某一个范围内并由对应的模块进行处理。
I/O端口的方式中,需要使用特殊的I/O指令读写设备控制器,访问寄存器需要使用汇编代码,调用过程中增加了控制I/O的开销。而内存映射I/O中,控制寄存器只是内存中的变量,CPU可以像访问任何内存中的变量一样对控制寄存器进行访问。另一方面,内存映射I/O中,引用内存地址的指令也可以被用于引用控制寄存器的地址,并且执行不同的行为,达到“多态”的效果
内存映射的缺点:与高速缓存存在冲突,如果对设备控制寄存器进行高速缓存&