leiyahui

纸上得来终觉浅,绝知此事要躬行
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停止当前正在运行的进程,将程序计数器等信息入栈,然后根据地址线上的数字查找中断向量表,找到需要运行的中断处理程序。

 

posted on 2015-12-14 16:14  雷大叔  阅读(1065)  评论(0)    收藏  举报