《计算机组成原理》 输入输出系统

words: 3.5k    views:    time: 12min
I/O


I/O功能模块通常简称为:I/O接口,也叫适配器,指CPU、主存和外围设备之间通过系统总线进行连接的标准化逻辑部件。为了保证处理器和不同外设之间高效和可靠的交互,CPU必须通过I/O接口与外设连接,其数据传送过程分为两个阶段:I/O接口与外设之间的数据传送,以及CPU与I/O接口之间的数据传送。

下图展示了CPU、I/O接口和外围设备之间的连接关系。其中外围设备自身带有设备控制器,它是控制外围设备进行操作的控制部件,它通过I/O接口接收来自CPU传送的各种信息,并根据设备的不同要求将这些信息传送到设备,或者从设备中读出信息传送到I/O接口。

一个标准的I/O接口可以连接一个或多个设备,其结构也如图中所示,通常包括如下功能:

  • 控制:接口模块根据指令信息来控制外围设备的动作,比如启动或者关闭;
  • 缓冲:接口模块在外围设备和计算机其他部件之间作为一个缓冲器,以补偿各种设备在速度上的差异;
  • 状态:接口模块监视外围设备的工作状态并保存,比如准备就绪或者忙,供CPU询问外围设备状态时用;
  • 转换:接口模块可以完成数据转换,保证数据能在外围设备和CPU之间正确的传送;
  • 整理:接口模块可以完成一些特别功能,当需要时可以修改字计数器或者当前内存地址寄存器;
  • 程序中断:当外围设备向CPU请求某种动作时,接口模块会产生一个中断请求信号到CPU;

1. 传输过程

为了与CPU交互信息的方便,在I/O接口内一般会设置一些可以被CPU直接访问的寄存器,称为端口。例如接收来自CPU等主控设备的控制命令的寄存器称为命令口,向CPU报告I/O设备工作状态的寄存器称为状态口,在外设和总线间交换数据的缓存寄存器称为数据口

为了便于CPU访问端口,也需要对端口编排地址,有两种方式,一种是统一编址,即将接口中的控制寄存器、状态寄存器以及数据寄存器与内存单元一样看待,将它们联合在一起编址,这样CPU就可以直接使用访问内存的指令其访问I/O设备端口了。另一种是I/O独立编址,即内存地址和I/O设备地址是分开的。

由于接口与CPU的速度大致相当,如果从读写接口内寄存器的角度看,CPU读写端口与读写内存是相似的,只不过相对于内存,端口的数据是动态变化的,因此访问端口需要确保信息的有效性。

对于输入过程:

  1. CPU将一个地址值放到地址总线上,选择某一输入设备;
  2. CPU等候输入设备的数据成为有效;
  3. CPU从数据总线读入数据,并放入对应的寄存器中;

对于输出过程:

  1. CPU将一个地址值放到地址总线上,选择某一输出设备;
  2. CPU将数据放到数据总线上;
  3. 输出设备认为数据有效,将数据取走;

2. 传输方式

根据传输过程,传输方式涉及到CPU与I/O接口,以及I/O接口与外设之间的不同处理,这里只简单讨论下CPU与I/O接口之间的方式,但不管那边的处理方式,都有一个等待数据变成有效的过程,问题是如何知道数据是有效的

2.1. 简单I/O方式

简单地假设外设始终处于就绪状态,数据传送时,将不作任何的状态检测。当然,只有当I/O接口与外设之间采用无条件传送时,CPU与I/O接口直接才能采用无条件传送方式。当简单外设作为输入设备时,可采用三态缓冲器与数据总线相连,作为输出设备时,一般采用锁存器。

2.2. 程序轮询方式

一般外设每传送完一次数据总有进行一段时间的处理或准备才能传送下一次数据,因此在数据传送之前,CPU需要通过接口对目标设备的状态进行查询。如果外设已经准备好了则传数据,如果未准备好则要不断地查询并等待,直到外设准备好信息交互。

程序轮询方式是一种简单的输入输出方式,数据在CPU和外设之间的传送完全交给计算机程序控制,其优点是CPU的操作和外设的操作能够同步,而且软硬件结构都比较简单。

  1. 接到总线上的每个设备都预先给定了设备地址码。CPU执行I/O指令时需要把指令中的设备地址送到总线上,用以指示CPU要选择的设备。每个设备接口都包含一个设备选择电路,
    用来判断总线上呼叫的是不是本设备,如果是则进入工作状态,否则不予理睬。
  2. CPU将读指令发送到控制寄存器,询问状态
  3. I/O控制器此时将状态寄存器置为未就绪
  4. 设备开始工作,读取数据,然后返回给I/O控制器,并且向I/O控制器报告设备的状态,比如是否已经读取完了
  5. I/O控制器将数据拷贝到数据寄存器
  6. I/O控制器更新状态寄存器为就绪,之前未就绪状态下CPU一直轮询访问
  7. 检测到就绪状态后,CPU从接口数据寄存器将数据拷贝到自己的寄存器中,并重置接口状态寄存器的状态
  8. CPU将寄存器中读取的数据送到主存中

2.3. 程序中断方式

中断是一种程序切换的方式,当外部发生某些随机事件需要及时处理时,无论CPU正在执行哪一条指令,都可以通过中断响应的方式暂停当前程序的执行,转而执行另一段中断服务程序。在高优先级的中断服务程序执行完毕后,再返回之前的程序从被中断的地方继续执行,但是有几个问题需要考虑:

尽管外界中断请求是随机的,但CPU只有在当前一条指令执行完毕后,执行公共操作时才受理中断请求,这样才不至于干扰当前指令的执行。通常外界的中断请求信号存放在接口的中断锁存器中,每当一条执行执行结束时,CPU便检测中断请求信号

为了在中断服务程序执行完毕后,能正确地返回到原主程序中被中断的断点继续执行,必须将程序计数器PC的内容,以及当前执行指令结束后CPU的状态,包括寄存器的内容和一些状态标志位,都保存到堆栈中。

当CPU响应中断后,正要去执行中断服务程序时,可能有另一个新的中断源向它发出中断请求。为了不致造成混乱,在CPU的中断管理部件中必须有一个中断屏蔽的触发器。

中断处理过程是由硬件和软件结合来完成的,中断周期由硬件实现,而中断服务子程序由机器指令序列实现,后者要负责保存和恢复现场。

中断方式中CPU将等待过程完全交给了IO设备自行处理,CPU在发起请求后继续执行后续指令(一般会对执行进行预取,放到指令队列中),然后I/O接口收到请求后,等到数据准备好后自行向CPU请求中断,这样CPU可以腾出更多的周期来执行程序指令。

2.4. DMA方式

中断的方式只是将等待过程交给IO设备自行处理,但是数据的传送依然有CPU自己负责,每一次传送,CPU都要进行一遍中断处理,完成一系列取指令、分析指令、执行指令的过程,而且要保存和恢复被中断程序的状态,在指令流水方式中,在中断发生或从中断返回时,指令队列预取的指令将全部作废。因此,在高速、大量地传送数据时,中断方式难以满足速度要求。

DMA是一种完全由硬件执行I/O交换的工作,由DMA控制器从CPU完全接管对总线的控制,数据交换不经过CPU,而直接在内存和外围设备之间进行,这样既能响应随机发生的服务请求,同时也省去了中断处理的开销。

DMA的数据传送分为三个阶段:

传送前预处理:由CPU负责,包括测试设备状态,向DMA控制器的地址寄存器送入设备地址并启动设备,向内存地址计数器送入起始地址,向字计数器送入交换的数据个数,这些完成后,CPU继续执行原来的程序。

正式传送:当设备准备好数据后,向DMA发出请求,由DMA向CPU申请总线使用权。CPU在指令周期结束后响应该请求并与总线脱离,然后DMA接管数据总线和地址总线,并将设备数据写入内存。

传送后处理:DMA在数据传输完毕之后请求CPU中断,CPU停止当前程序,执行中断处理,包括校验写入内存的数据是否正确,检测传送过程是否发生错误等待。

但是还有一个问题,如何解决DMA与CPU共用主存和总线的冲突?

成组连续传送方式:当外围设备要传送一批数据时,由DMA控制器发一个停止信号给CPU,要求CPU放弃对总线的使用权,DMA在获得总线控制权之后开始传送数据,在一批数据传送完毕后,DMA通知CPU可以使用内存,并把总线控制权还给CPU。 但是这样浪费了内存的性能,因为外设在传送两次数据之间的间隔一般都都大于内存存取周期,比如软盘读出一个8位二进制数大约需要32us,而内存的工作周期小于0.2us,因此就浪费了很多内存的存储周期,可以考虑让给CPU使用。

周期挪用方式:I/O设备要求DMA传送时可能遇到两种情况:一种是CPU此时不需要访问内存,比如执行一些耗时较长的乘法指令;另一种是I/O设备要求访问内存时CPU也要求访问内存,这就产生了冲突,这种情况下I/O设备优先,因为I/O设备访问内存有时间要求,前一个I/O数据必须在下一个访问内存请求到来之前存取完毕。与上面停止CPU访问内存的方式比较,这样既实现了I/O传送,又较好地发挥了内存和CPU的效率,其相当于在CPU执行访问内存指令的过程中插入了DMA访问内存的请求,穿插挪用了内存周期。但每一次的周期挪用依然有申请和归还总线控制权的操作,其实就是将上面的过程拆碎了穿插到CPU的执行过程中。

透明DMA方式:如果CPU的工作周期比内存存取周期长很多,则可以考虑交替访问内存。比如CPU的工作周期为1.2us,而内存周期小于0.6us,则可以将一个CPU周期分为固定的c1和c2两个周期,对于总线和内存的使用权,c1交给CPU,c2交给DMA。即将一个CPU周期内除了访问内存之外的时间让给DMA,这样分时使用,就免去了申请和归还总线以及内存的控制权问题,CPU和DMA都感知不到对方的存在。

2.5. 通道和输入/输出处理器

DMA方式已经减轻了CPU对数据输入输出的控制,显著提高了CPU的效率。而通道则更进一步,它有自己的指令和程序专门对数据的传输控制,这样CPU将数据的传输控制进一步放权给通道负责,而自己只负责数据处理。这样,通道与CPU分时使用存储器,实现了CPU内部运算和I/O设备的并行工作。

几种传送方式总结起来可以比喻成老师给孩子分糖,每人两块。第一种方法是先给孩子A一块糖,看着他吃完了再给第二块,然后再给孩子B,以此类推。第二种方法是每人发一块糖各自去吃,然后吃完的举手报告,并给第二块糖。第三种办法是直接给每人两块糖,吃完的报告,这样老师便可以腾出写实现做些其它事。当然,还可以干脆将发糖交给一个特定的人负责,然后只在必要时才过问一下。


参考:

  1. 《计算机组成原理》
  2. https://blog.csdn.net/zhanglh046/article/details/115439677
  3. https://blog.csdn.net/MiracleWW/article/details/114747638