除了处理器和存储模块外,计算机系统中第3个关键元素是Io模块。每个模块与系统总线或中央交换机之间都有接口,并控制一个或多个外围设备。io模块不仅物理上连接设备和系统总线,还包含外围设备与总线之间执行通信功能的逻辑,通信包括控制、状态和数据。
读者可能会好奇:为什么不直接把外围设备连接到系统总线呢?原因如下:
1.外设种类繁多,操作方法也各不相同。
2.外设的数据传输率常常比内存或处理器的慢得多。
3.外设使用的数据格式和字长常常不同于其连接的计算机。
4.因此需要io模块,功能为通过系统总线或中央交换机与处理器和内存连接;通过定制的数据链路连接到一个或多个外围设备。
7.2 io模块
io模块的主要功能和需求分为以下几种:
1.控制和计时;
2.处理器通信;
3.设备通信;
4.数据缓冲;
5.错误检测;
在任何时间段内,处理器可能会以不可预知的模式与一个或多个外部设备通信,这取决于程序对io的需求。因此,io功能包含了控制和定时,以协调内部资源和外部设备之间的流量。
控制数据从外设到处理器就可能有以下步骤:
处理器查询io模块以检查相连设备的状态;
io模块返回设备状态;
如果设备可操作且已准备好传输,那么处理器通过向io模块发送命令来请求传输数据;
io模块从外部设备获取一个单元的数据(如8位或16位);
数据从io模块传输到处理器;
如果系统使用了总线,那么处理器 io模块之间的每个交互都会涉及一个或多个总线。
处理器通信包括以下内容:
命令译码:io模块从处理器接收命令,一般是作为控制总线上的信号发送的。
数据:通过数据总线在处理器与io模块之间交换数据。
状态报告:由于外设非常慢,因此了解io模块的状态非常重要;
地址识别:每个io设备也有一个唯一标注自身的地址;
io模块还必须能与设备通信,这个通信包括了命令、状态信息和数据。
io模块的一个基本任务是数据缓冲。来自主存的数据以快速突发的方式被传递给io模块。然后数据在io模块中缓冲,接着再以外设的数据传输率传输至外设。反之,缓冲数据,以免在慢速传输中占用内存。所以,io模块必须能同时以设备和内存速度运行。
最后,io模块通常还负责错误检查以及随后向处理器报告错误。检测传输错误通常使用某种形式的校验码。io模块检查奇偶校验来确定是否有错误发生。
7.3 可编程io
有三种技术可以用于io操作。对于可编程io,数据在处理器和io模块之间交换。当处理器向io模块发出一个命令时,它必须等待io操作完成,该技术缺点是使处理器保持不必要的忙碌。对于中断驱动io,处理器发出io命令,然后继续执行其他指令,当io模块完成其工作后中断处理器,该技术比可编程io更高效,因为它消除了不必要的等待。但是,中断io仍然消耗了大量的处理器时间,因为每个数据字从内存到io模块。这2者都需要处理器负责从主存提取输出数据和向主存输入数据。还有一种称为直接内存访问dma,io模块与主存直接交换数据,不涉及处理器。
7.5 直接内存访问
7.5.1 可编程io和中断io的缺点:
io传输速率受限于处理器测试并服务设备的速度;
处理器忙于管理io传输,每次io传输都要执行很多指令;
使用简单的可编程io,处理器专注于io任务,可以以相当高的速率移动数据,代价是不做任何其他事情。中断io在一定程度上释放了处理器,代价是io传输速率。
当移动大量数据时,用直接内存访问dma。
7.5.2 dma功能
dma涉及系统总线上的一个附加模块。dma模块能模拟处理器,并确实从处理器接管了对系统的控制,才能通过系统总线与内存传输数据。为此,dma模块必须仅在处理器不需要总线的时候才使用总线,或者它必须迫使处理器暂时挂起。后一种技术更常见,称为周期窃取,因为dma模块实际上窃取了总线周期。当处理器想要读写数据时,它向dma模块发出一条命令,以向dma模块传递以下信息:
是否有读或写请求,使用处理器与dm模块之间的读或写控制线。
所涉及的io设备地址,用数据传输。
内存中用于读写的起始位置,用数据线传送,由dma模块存储在地址寄存器中。
要读写的字数,也要数据线传送,保存在数据寄存器中。
之后,处理器继续其他的工作,它已经把io操作委托给dma模块。dma模块直接把整个数据块传送给内存,或是从内存传输出去,一次一个字,不需要经过处理器。当传输结束时,dma模块向处理器发送一个中断信号。
整体效果上,dma使得处理器执行的更慢,然而,对于多字传输,dma比中断驱动io或可编程io的效率要高很多。
dma模块若充当代理处理器,用可编程io通过dma模块在内存与io模块之间交换数据,这种结构虽然便宜,但是显然效率很低。与处理器控制的可编程io一样,每传输一个字消耗2个总线周期。
若集成dma和io功能可以大大减少所需总线周期数,这意味着在dma模块和一个或多个不包含系统总线的io模块之间存在路径。dma逻辑上可能时io模块的一部分,也可能是控制一个或多个io模块的独立模块。这个概念可以更进一步,用io模块总线将io模块连接到dma模块,这就把dma模块中的io接口数量减少到一个,并提供了一个易于扩展的结构。此时,dma模块和处理器与内存共享的系统总线仅仅被dma模块用来与内存交换数据。dma与io模块之间的数据交换在系统总线之外进行。