系统接口
块设备接口
- 块设备:数据的存取和传输都是以数据块为单位的设备。典型的块设备是磁盘。该设备的基本特征是传输速率高,另一特征是可寻址,即能指定数据的输入源地址及输出的目标地址,可随机读写。磁盘设备通常采用DMA方式。
- 隐藏了磁盘的二维结构
- 将抽象命令映射为低层操作:块设备支持上层发来的对文件或设备的打开、读写、关闭等抽象命令。该接口会将上述的接口转换成实际的需要的更为复杂的命令
流设备接口
流设备接口实际上也是字符设备接口,它反应了大部分字符设备的本质特征,用于控制字符设备的输入或输出。- 字符设备:数据存取都是以字符为单位,如键盘、打印机等。字符设备基本的特征是传输速度慢,通常每秒几个字节到几千个字节。还有一个特征是不可寻址,不能只能数据的输入源和输出的目标地址。字符设备在输入/输出时采用中断驱动方式
- get和put操作:由于字符是不可寻址的,因而对它只能采用顺序存取的方式。通常是为每一个字符设备建立一个字符缓冲区(队列),设备的IO字符流顺序地进入队列,或者是从队列中取走一个字符。get是从缓冲区立刻获取一个字符,pu是把一个新的字符写入缓冲区,等待送到设备
- in-control :因为字符设备类型太多,为了统一管理他们,通常在流设备接口中提供一种通用的in-control指令,在该指令中包含了许多参数,每一个参数表示一个鱼具体设备相关的特定功能。大多数字符设备是独占设备,必须采取互斥方式实现共享。因为,设备提供了打开和关闭的操作。在使用这类设备时,必须先打开设备,才能使用。如果已被打开,表示其他进程正在使用该设备。
网络通信接口
网卡
设备与控制器之间的接口
一般情况下,设备不是直接和cpu进行连接的,硬件设备是和设备控制器连接的。因此,IO设备中应该包含与设备控制器之间的接口。在该接口中,有三种类型的信号:- 数据信号线:比如输入设备中,由外界输入的信号经过转换器转换后,所形成的数据通常是先进入缓冲器中,当数据量达到一定量后,再从缓冲器通过一组数据信号线传送给设备控制器;对于输出设备而言,是先从设备控制器经过数据线传来的一批缓冲器中,经过适当的转换后,再逐个字符输出
- 控制信号线:是由设备控制器向设备发送控制信号的通路。该信号规定了设备要执行的操作,如读操作或写操作或者是移动磁头的操作
- 状态信号线:用来传送设备的当前状态的信号。设备当前的状态有:在读、在写、已读、已写、并准好新的数据传送
设备控制器
一个设备控制器可以控制多个设备,它是一个可编址的设备。连接一个设备的话,就只有一个设备地址,连接多个的话,就有多个设备地址。每一个设备地址对应一个设备。 设备控制器可分为两种类型:- 控制字符设备的控制器
- 控制块设备的控制器
设备控制器基本功能
- 接受和识别命令:在控制器中有对应的控制寄存器,用户存放接收到的命令和参数,并对所接收的命令进行译码。
- 数据交换:它能接受cpu传来的数据,同时还要接收设备传来的数据。所以,它必须设置对应的数据寄存器
- 标识和报告设备状态:它有对应的状态寄存器,用其中的每一位表示设备的某一种状态。当cpu需要知道当前设备的状态,直接从控制器就返回了
- 地址识别:设备控制器必须能识别每个设备的地址,还有对应寄存器中对应的唯一的地址
- 数据缓冲区:由于IO设备速度较低,而CPU和内存的速度很高,所以在控制器中必须设置一个缓冲区。设备到内存时,可以累积一批数据后,再将缓冲区的数据高速传递给内存;内存到设备时,先是多次将数据存入缓冲区中,再一次性送到设备。
- 差错控制:如果出现错误,会将错误向cpu报告,于是cpu会将本次传输的数据丢掉,再进行重新一次的传输。
设备控制器的组成
设备控制器是工作在硬件设备和cpu之间的,所以有以下三部分组成:- 设备控制器和cpu的接口:用于实现设备控制器和cpu的交互。所以该接口中三类信号线:
- 数据线:通常和两类寄存器连接,一种是数据寄存器,这种寄存器有一个或者多个,用于存输入或者输出的数据;另一种是控制/状态寄存器,用来存放cpu发送的指令或者是设备状态;
- 地址线
- 控制线
- 设备控制器与设备的接口:一个设备控制器可以控制多个设备。每个接口中都有数据、控制和状态三种类型的信号。控制器中IO逻辑根据发来的地址选择一个设备口。
- IO逻辑:它实现对设备的控制。它是通过一组控制线与CPU交互,CPU利用该逻辑向控制器发送IO命令。每当CPU要启动一个设备时,一方面将启动命令发送给控制器,另一方面同时通过地址线把地址发送给控制器,由控制器的IO逻辑对收到的地址进行译码,再根据翻译后的命令对设备进行控制。
内存映像IO
驱动程序将抽象的IO命令转换成一些列的具体的命令、参数等数据载入设备控制器相应的寄存器中,有控制器来执行这些命令,具体实施对IO设备的控制。有一下两种方法来完成:- 利用特定的IO指令: 固定的命令:如 io-store cpu-reg,dev-no,dev-reg cpu-reg :cpu某一个寄存器 dev-no: 指定的设备 dev-reg : 指定控制器里面的寄存器 这种方式的缺点:访问内存和访问设备需要两种不同的指令
- 内存映像IO: 这种方式在编址和前面不同,它不区分是cpu寄存器,还是存储设备或者是寄存器地址,统一使用K值。当k在0~n-1时,表示内存地址;大于等于n时,表示第0个设备控制器的第一个寄存器地址。通过确定是n的多少倍,确定是第几个设备控制器,通过余数确定是寄存器的地址。所以,在编致上面简化了很多。 例如:sore cpu-reg,n
IO通道
有了设备控制器以后,CPU已经和设备之间简化了交互,想要获取或者写入数据的时候,通过指令集就可以完成了。并且,一个设备控制器可以控制多个设备。但是,当一个机器要控制非常多的设备的时候,CPU要和这么多的设备和设备控制器交互,显得有点笨重。CPU要花很多的时间消耗在控制设备控制器的上面。 引入通道,就是为了让一些原来由CPU处理的IO任务,现在交给通过来承担。从而把CPU从繁杂的IO任务中解脱出来。在设置了通道后,CPU只需要向通道发送一个IO指令。通过接到指令后,就从内存中取出要执行的通道程序,然后执行通道程序。仅当通道完成了规定的IO任务后,才向CPU发送中断信号。 通道就是一个简单版的CPU,只是这个CPU执行的指令简单,并且通道是没有自己的内存的,它执行的通道程序还是放在内存中的。通道和CPU共享内存的。通道类型
因为外围的设备不同,有流设备,有块设备,他们的传输速度不一样, 所以对应的通道类型也有不同。目前三种类型的通道:- 字节多路通道:一个主通道连接几个到几百个数量不等的子通道。按照字节交叉式工作的通道。多个子通道连接一个主通道,当一个子通道完成数据交换以后,换成第二个子通道和主通道连接,进行交换数据。
- 数组选择通道:字节多路通道不适合连接高速的设备,数据读取消耗的时候还没有切换子通道的耗时多,所以有了数组选择通道。一个通过可以连接多个高速设备,但是,这个通道在一段时间内只能执行一道通道程序,控制一台设备进行数据传送。当一个设备占用了该通道以后,它就一直占着,即使它没有数据传输也会占着,直到该设备的数据传输完毕以后才会释放该通道。所以,这种通道的利用率很低。
- 数组多路通道:它有字节多路通道的多路,有数组选择通道的传输速率。所以,这种方式使用率最高。