概念
基本结构
数据传送方式
- 并行接口
- 一个字节或者一个字所有位同时传送
- 串行接口
- 一位一位地传送
功能
-
- 数据缓冲
- ◦解决CPU和外设之间的速度差距
-
- 提供联络信息
- ◦协调与同步数据交换过程
-
- 信号与信息格式的转换
- ◦模/数、数/模转换,串/并、并/串转换,电平转换
-
- 设备选择
-
- 中断管理
-
- 可编程功能
I/O端口及其编址方式
-
I/O端口
- ◦ I/O接口内部包含一组称为I/O端口的寄存器
- ◦ 每个I/O端口都需有自己的端口地址(或称端口号),以便CPU访问
-
I/O端口的编址方式
-
I/O端口和存储器分开编址
- ◦ I/O映像的I/O方式,I/O Mapped I/O
- ◦ x86体系结构采用该方式
-
I/O端口和存储器统一编址
- ◦ 存储器映像的I/O方式,Memory Mapped I/O
- ◦ ARM、MIPS、PowerPC等体系结构采用该方式
-
I/O控制方式
- ◦ CPU如何控制外设的数据传送
1. 程序控制方式
-
① 无条件传送方式
- ◦ 假定外设已经准备好
- ◦ CPU直接使用指令与外设传送数据
- ◦ 不查询外设的工作状态
-
② 程序查询传送方式
- ◦ CPU通过执行一段程序,不断查询外设的工作状态
- ◦ 在确定外设已经准备就绪时,才进行数据传送
- 处理流程
- ① CPU执行指令,将控制字写入接口的“控制寄存器”,从而设置接口的工 作模式
- ② CPU执行指令,将数据写到接口的“输出缓冲寄存器”
- ③ 接口将数据发到“并行数据输出”信号线上,并将“输出准备好”信号置为有效(亦可由CPU写控制字将该信号置为有效)
- ④ 外设发现“输出准备好”信号有效后,从“并行数据输出”信号线上接收数据,并将“输出回答”信号置为有效
- ⑤ 接口发现“输出回答”信号有效后,将“状态寄存器”中的状态位“输出 缓冲空”置为有效
- ⑥ 在这个过程中,CPU反复执行指令从“状态寄存器”中读出状态字,直到发现“输出缓冲空”,然后开始下一个输出过程,继续输出新数据
- 程序查询方式接口结构
- 有点
- 较好协调主机与外设之间的时间差异,所用硬件少。
- 缺点
- 主机与外设只能串行工作,主机一个时间段只能与一个外设进行通讯,CPU效率低。
2. 中断控制方式
- 数据输出过程
- ① CPU执行指令,将控制字写入接口的“控制寄存器”,从而设置接口的工 作模式
- ② CPU执行指令,将数据写到接口的“输出缓冲寄存器”
- ③ 接口将数据发到“并行数据输出”信号,并将“输出准备好”信号置为有效(亦可由CPU写控制字将该信号置为有效)
- ④ 外设发现“输出准备好”信号有效后,从“并行数据输出”信号接收数据, 并将“输出回答”信号置为有效
- ⑤ 接口发现“输出回答”信号有效后,通过“中断控制逻辑”向CPU发出中 断请求信号,并将“状态寄存器”中的状态位“输出缓冲空”置为有效
- ⑥ CPU收到中断请求后,进入中断服务程序,执行指令从“状态寄存器”中 读出状态字,发现“输出缓冲空”,因此开始下一个输出过程,继续输出 新数据
- 优缺点
- 优点:避免频繁查询,适合随机出现的服务和中低速外设使用。
- 缺点:成批数据交换时,中断影响传送效率,一次传送一个字符,中断处理时间大于传送数据时间。需要一定的硬件电路。
3. 直接存储器访问(DMA)方式
- 定义
- ◦ 数据传送过程不需要CPU干预(不需要执行程序指令)
- ◦ 由专门硬件控制电路控制,进行外设与存储器间直接数据传送
- ◦ 该专门硬件控制电路称为DMA控制器,简称DMAC
- 工作原理
- 在外围设备和主存之间开辟直接的数据通路。在正常工作时,所有的工作周期均用于执行CPU的程序。当外围设备完成I/O的准备工作后,占用CPU的工作周期,和主存直接交换数据。完成后,CPU又继续控制总线,执行原程序。完成这项工作的是系统中增设的DMA控制器。
- 工作步骤 - 1、CPU设置DMAC内部配置寄存器 - 2、DMAC处于空闲等待状态 - 3、I/O接口向DMAC发出DMA传送申请 - 4、DMAC响应I/O接口的申请 - 5、DMAC向I/O接口发起总线读传输 - 6、DMAC向存储器发起总线写传输 - 7、重复5~6直到本次DMA传送完成 - 8、返回2,等待下一次DMA传送申请
- 缺点
- 每个需要进行DMA传送的外设都要对应一个DMA控制器,且DMA控制器是由硬件实现的,不易修改。于是在大型计算机系统中通常设置专门的硬件装置—通道。
- 独立的dma控制器和自带的dma控制器
- 每个需要进行DMA传送的外设都要对应一个DMA控制器,且DMA控制器是由硬件实现的,不易修改。于是在大型计算机系统中通常设置专门的硬件装置—通道。
4、I/O通道控制方式
- 定义
- 说通道是一种弱鸡版的CPU是因为,与CPU相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中的,也就是说通道与CPU共享内存。
- 工作原理
- I/O通道具有少数专用的指令系统,能实现指令所控制的操作,管辖其相应的设备控制器,所以I/O通道已具备简单处理机的功能。但它仅仅是面向外围设备的控制和数据的传送,其指令系统也仅仅是几条简单的与I/O操作有关的命令。
- I/O通道要在CPU的I/O指令指挥下启动、停止或改变工作状态。因此,l/O通道不是一个完全独立的处理机,它只是从属于CPU的一个专用I/O处理器。它的进一步发展是引入专用的输入输出处理机。
- 工作步骤
- 特点
- 通道方式的出现进一步提高了CPU的效率。但需更多的硬件电路。
5、 输入输出处理机(IOP)方式
- 有单独的存储器和独立的运算部件,可访问系统的内部存储器
- 除数据传输外,还应有以下功能:能处理传送过程中出错及异常情况,数据格式翻译,数据块校验。
- IOP方式是通道方式的进一步的发展。它们大多应用在中、大型计算机中。
- 对比
- 我们其实可以发现,程序中断方式和DMA方式主要是针对CPU参与的两个过程:I/O准备和数据传送来做出改进。
- 中断方式是对I/O准备做出改进,它不需要CPU不断查询来确认外设状态,而是引入了中断机制,在I/O准备好后,通过中断请求通知CPU,而在外设准备阶段,CPU是可以执行原来的主程序,也就是说CPU只参与数据传送阶段。而DMA方式更是将数据传送阶段也给省了,将数据传送的工作交给DMA控制器,使得CPU更加专注于主程序的执行。
设备
CPU执行指令除了访问内存之外还要访问很多设备(Device),如键盘、鼠标、硬盘、显示器等,那么它们和CPU之间如何连接呢?如下图所示。
IO端口的编址方式
有些设备像内存芯片一样连接到处理器的地址总线和数据总线,正因为地址线和数据线上可以挂多个设备和内存芯片所以才叫“总线”,但不同的设备和内存芯片应该占不同的地址范围。访问这种设备就像访问内存一样,按地址读写即可,但和访问内存不同的是,往一个地址写数据只是给设备发一个命令,数据不一定要保存,而从一个地址读数据也不一定是读先前保存在这个地址的数据,而是得到设备的当前状态。设备中可供读写访问的单元通常称为设备寄存器(注意和CPU寄存器不是一回事),操作设备的过程就是读写这些设备寄存器的过程,比如向串口发送寄存器里写数据,串口设备就会把数据发送出去,读串口接收寄存器的值,就可以读取串口设备接收到的数据。
还有一些设备集成在处理器芯片中。在上图中,从CPU核引出的地址和数据总线有一端经总线接口引出到芯片引脚上了,还有一端没有引出,而是接到芯片内部集成的设备上,无论是在CPU外部接总线的设备还是在CPU内部接总线的设备都有各自的地址范围,都可以像访问内存一样访问,很多体系结构(比如ARM)采用这种方式操作设备,称为内存映射I/O(Memory-mapped I/O)。但是x86比较特殊,x86对于设备有独立的端口地址空间,CPU核需要引出额外的地址线来连接片内设备(和访问内存所用的地址线不同),访问设备寄存器时用特殊的in/out指令,而不是和访问内存用同样的指令,这种方式称为端口I/O(Port I/O)。
IO与进程
从CPU的角度来看,访问设备只有内存映射I/O和端口I/O两种,要么像内存一样访问,要么用一种专用的指令访问。其实访问设备是相当复杂的,计算机的设备五花八门,各种设备的性能要求都不一样,有的要求带宽大,有的要求响应快,有的要求热插拔,于是出现了各种适应不同要求的设备总线,比如PCI、AGP、USB、1394、SATA等等,这些设备总线并不直接和CPU相连,CPU通过内存映射I/O或端口I/O访问相应的总线控制器,通过总线控制器再去访问挂在总线上的设备。所以上图中标有“设备”的框可能是实际的设备,也可能是设备总线的控制器。
在x86平台上,硬盘是挂在IDE、SATA或SCSI总线上的设备,保存在硬盘上的程序是不能被CPU直接取指令执行的,操作系统在执行程序时会把它从硬盘拷贝到内存,这样CPU才能取指令执行,这个过程称为加载(Load)。程序加载到内存之后,成为操作系统调度执行的一个任务,就称为进程(Process)。进程和程序不是一一对应的。一个程序可以多次加载到内存,成为同时运行的多个进程,例如可以同时开多个终端窗口,每个窗口都运行一个Shell进程,而它们对应的程序都是磁盘上的/bin/bash文件。
操作系统(Operating System)本身也是一段保存在磁盘上的程序,计算机在启动时执行一段固定的启动代码(称为Bootloader)首先把操作系统从磁盘加载到内存,然后执行操作系统中的代码把用户需要的其它程序加载到内存。操作系统和其它用户程序的不同之处在于:操作系统是常驻内存的,而其它用户程序则不一定,用户需要运行哪个程序,操作系统就把它加载到内存,用户不需要哪个程序,操作系统就把它终止掉,释放它所占的内存。**操作系统最核心的功能是管理进程调度、管理内存的分配使用和管理各种设备,做这些工作的程序称为内核(Kernel),在我的系统上内核程序是/boot/vmlinuz-2.6.28-13-generic文件,它在计算机启动时加载到内存并常驻内存。**广义上操作系统的概念还包括一些必不可少的用户程序,比如Shell是每个Linux系统必不可少的,而Office办公套件则是可有可无的,所以前者也属于广义上操作系统的范畴,而后者属于应用软件。
IO与中断
访问设备还有一点和访问内存不同。内存只是保存数据而不会产生新的数据,如果CPU不去读它,它也不需要主动提供数据给CPU,所以内存总是被动地等待被读或者被写。而设备往往会自己产生数据,并且需要主动通知CPU来读这些数据,例如敲键盘产生一个输入字符,用户希望计算机马上响应自己的输入,这就要求键盘设备主动通知CPU来读这个字符并做相应处理,给用户响应。这是由中断(Interrupt)机制实现的,每个设备都有一条中断线,通过中断控制器连接到CPU,当设备需要主动通知CPU时就引发一个中断信号,CPU正在执行的指令将被打断,程序计数器会指向某个固定的地址(这个地址由体系结构定义),于是CPU从这个地址开始取指令(或者说跳转到这个地址),执行中断服务程序(ISR,Interrupt Service Routine),完成中断处理之后再返回先前被打断的地方执行后续指令。比如某种体系结构规定发生中断时跳转到地址0x00000010执行,那么就要事先把一段ISR程序加载到这个地址,ISR程序是内核代码的一部分,在这段代码中首先判断是哪个设备引发了中断,然后调用该设备的中断处理函数做进一步处理。
由于各种设备的操作方法各不相同,每种设备都需要专门的设备驱动程序(Device Driver),一个操作系统为了支持广泛的设备就需要有大量的设备驱动程序,事实上Linux内核源代码中绝大部分是设备驱动程序。设备驱动程序通常是内核里的一组函数,通过读写设备寄存器实现对设备的初始化、读、写等操作,有些设备还要提供一个中断处理函数供ISR调用。