I/O原理
一 I/O设备
I/O设备一般分为两种:
块设备:每个块都有自己的地址,传输依次是以块为单位进行的通常在512-32768之间,典型的就是磁盘
字符设备:没有固定的地址,每次以字符为单位接收或发送一个字符流。如键盘,鼠标
二 设备控制器
I/O设备一般由机械部分和电子部分组成,电子部分就称为设备控制器或者适配器
控制器一般有一个连接器,通往设备本身的电缆可以连接到这个连接器,一个设备控制器可以控制2,4,8或者更多个设备。
控制器的主要任务是将串行的位流转换为字节块,并进行必要的校正工作。
比如说磁盘,从磁盘驱动器出来的是字节流,因此到设备控制器后,在设备控制器的内部的缓冲区进行组装,然后进行校验,最后再将它复制进入内存。
每个设备控制器都会有几个寄存器用来与cpu进行通信,通过这些寄存器,cpu可以命令寄存器进行一些操作,比如发送数据,接收数据,开启或者关闭
另外设备寄存器还有一个操作系统可以读写的缓冲区
三 内存映射I/O
cpu与设备控制器和数据缓冲区的通信有两种方式
1 给每个设备控制器分配一个端口号,所有的I/O端口构成一个I/O端口空间,并且受到保护,普通的用户程序无法访问这些端口,只有操作系统能够访问
使用一条特殊的指令 如:in reg port,或者out reg port
2 将所有的设备控制器映射到内存中,这样的话每个设备控制器都被分配一个地址,而不会再有内存被分配这个地址,这样的系统被称为内存映射I/O ,
通长设备控制器被分配的地址位于地址空间的顶端,如pentium处理器就是采用这种系统,0-(64k-1)分配给设备控制寄存器的I/O端口,64k-(1M-1)分配给数据缓冲区
内存映射I/O的优点:
1访问这些设备控制器的时候不必再使用汇编代码了,因为它被分配的有地址,所以说可以使用C语言或者C++来访问
2不必再采用特殊的方式来访值用户进程访问设备控制器了,只要不把内存分配给用户的虚拟地址空间中就可以了
3内存映射I/O可以引用内存中的每一条指令,也可以引用设备控制寄存器中的内容
四 直接存储器存储
不管是否存在内存映射I/O,cpu都要用设备控制器中按照字来读取数据,这样来回特别的浪费cpu 的时间(因为cpu的速度是非常的快的),所以说使用一种称为直接存储器(Direcrt Memory Access,DMA)的设备。
大多数计算机系统中都有这种设备,有的是一个设备配备一个DMA,但更多的是一台主机只配备一个DMA,由它来操控多个设备的数据传输,
DMA能够访问地址总线,其中包括内存地址寄存器,字节计数寄存器,和多个控制寄存器(表示I/O端口号,传送方向)
在没有DMA控制器的时候,首先设备控制器按位将字节流读进缓冲区中,然后缓冲区校验,如果没有错误,产生中断,然后cpu一个字一个字的从缓冲区中读取,然后放进内存中
如果有了DMA控制器之后,就不需要cpu了,它发起一个读的请求,然后控制总线,就能够将缓冲中的数据读进内存中。
五中断
当某个I/O结束的时候就会产生中断,主板上有一个中断控制器,每个设备都与中断控制器相连接,中断控制器通过总线与cpu相连接,当中断发生的时候中断控制器接收到I/O端口发出的信号,如果说没哟其他中断没有处理就处理这个中断
中断控制器在地址线上放置一个数字表明是哪一个中断,然后导致cpu停止当前正在运行的进程,将程序计数器等信息入栈,然后根据地址线上的数字查找中断向量表,找到需要运行的中断处理程序。
浙公网安备 33010602011771号