本系列文章为哈尔滨工业大学刘宏伟计算机组成原理学习笔记,前面的系列文章链接如下:
计算机组成原理:P1-计算机系统概述
计算机组成原理:P2-系统总线
计算机组成原理:P3-存储器(上)
计算机组成原理:P4-存储器(中)
计算机组成原理:P5-存储器(下)
前言
I/O设备是计算机组成原理之硬件最后的一部分。输入输出系统是计算机系统当中种类最多、功能最多、结构最复杂、构成也最多样的系统。在现代计算机系统当中,外部设备的总成本可以占到计算机总成本的80%以上。可以说,没有这些丰富多彩的外部设备,就没有现代计算机在各个领域的大规模应用。
----早期的计算机任务比较少,它所面临的核心任务就是计算。全球计算机的数量也非常少,外部设备的种类就更少。
----随着计算机的发展,计算机的应用领域在逐步的进行拓展。比如在60年代,计算机开始被应用到文本处理当中,就产生了字符发生器和字符型的显示器。随着计算机的进一步发展,计算机在多媒体、嵌入式计算等领域也被大规模的应用。比如说,把嵌入式的计算机系统装载到自动设备中、装载到武器装备中,控制设备或武器,让这些设备能够自主的进行工作。
----现代外部设备和计算机的应用就更加广泛了。比如说现代的互联网、云计算、物理信息系统、流行的互联网+等。
输入输出系统的发展概述
①早期
----早期的计算机的数量少、应用少、外部设备也非常少,外部设备和主机之间的连接是采用分散连接的方式。也就是说每一个设备都有专门的控制线路,这些控制电路甚至和CPU的控制电路设计在一起,紧耦合。这个时候,增加和删除外部设备都非常难。但是由于当时外部设备的数量比较少,计算机的数量也非常少,那么这种设计还是值得的。
----这个时候,外部设备和主机之间的数据传输主要是采用程序查询方式。在这种方式当中,CPU的工作和I/O的工作是串行进行的。I/O进行数据输入输出的时候,CPU必须运行相应的程序或者是处在停等状态。
②接口模块和DMA阶段
随着计算机的发展,外部设备越来越多,分散连接的方式已经不适应外部设备的发展和计算机技术的发展以及计算机应用领域的拓展。这种情况下就出现了I/O接口,出现了DMA控制器。
----用I/O接口和DMA控制器,与主机的CPU相互配合,完成数据的输入和输出操作
----连接方式也发生了变化,采用总线的方式进行连接。I/O设备通过接口连接在总线上,一个总线可以连接多个设备,总线另外一端和主机相连。
----这种情况下,主机和I/O设备进行传输的传输控制方式也发生了变化。要求CPU和I/O之间要进行并行的工作,那也就出现了另外两种信息交换的传输控制方式,即中断方式和DMA方式。另外,在这两种方式当中,在信息传输过程当中或者是信息传输完成之后,CPU仍要参加或仍要参与部分信息传输的处理工作。
③为了使CPU的工作和I/O的工作能够并行起来,或者是输入输出系统的数据输入输出的管理控制尽可能的从主机当中独立出来,又出现了具有通道结构的I/O阶段。通道可以看作是一种简单的处理器,或者是一个小型的功能更强的DMA控制器。它能够执行通道程序,通道有自己的指令系统。通过执行通道程序,可以控制连接在通道上的I/O设备和主机之间直接进行信息传输。
④下一种方式比通道方式更复杂,它的独立性更强,那就是采用I/O处理机,I/O处理机可以是专用的处理器,在大型计算机当中,我们可以使用现代的微处理器直接作为I/O处理机来用,控制I/O设备的工作。或者是在有一些大型计算机当中,直接采用和主机当中处理器完全相同的处理器,来作为I/O处理器。这个时候的I/O处理机功能非常强大,甚至在没有I/O设备工作的时候,I/O处理机可以作为主机的处理器完成计算任务。
总结: 从这个概况当中,大家要看到一个事实。随着I/O系统或者输入输出系统的发展,数据的输入输出操作逐渐的被从CPU当中分离出来,外部设备的独立性越来越强。
输入输出系统的组成
I/O系统它的组成分为软件和硬件两大部分。
I/O软件
我们把I/O软件分成了两大部分
①第一部分是主处理器(或者是CPU)指令集当中的IO指令。程序员把这些I/O指令编写到应用程序当中,CPU执行这些I/O指令,控制外部设备,使外部设备和CPU和主机之间能够协调地进行工作。
IO指令的格式:
第一部分是操作码,实际上I/O指令的操作码相当于I/O指令的一个标志,它表示这样的指令是I/O指令。
第二部分是命令码,相当于CPU指令集当中普通指令的一个操作码,它指出了要对I/O设备做什么样的操作。比如说对I/O设备进行查询、输入、输出、以及进行其他的控制。
第三部分是设备码,给出的是I/O设备的编码,也就是I/O设备的地址,或者是I/O设备当中某一个寄存器的地址。这些寄存器,我们把它叫做I/O的端口。
②第二部分就是通道指令。上面我们对通道指令做了一个简要的说明,通道是一种小型的DMA处理器,能够实现I/O设备和主机之间直接进行信息传送。通道有自己的控制器,有的通道还有自己的存储器。通道能够执行由通道指令组成的通道程序。通道指令就是通道自身的指令。
----通常情况下,编程人员在应用程序当中为了调用外部设备,使外部设备能够工作,在应用程序当中需要增加广义I/O指令。
----广义I/O指令要指出参加数据传输的I/O设备、数据传输主存的首地址、传输数据的长度、传输的方向是向I/O设备进行传输数据还是向主储存传输数据。
----操作系统根据广义I/O指令给出的参数以及要求的操作,会编写一个由通道指令组成的通道程序,并且把通道程序放在内存或者是通道自己内存的指定位置,之后启动通道进行工作。
----通道拿到通道程序的首地址以后,就可以执行通道程序,控制I/O设备完成相应的输入和输出的工作。所以通道指令当中它的一些参数需要指出要传输的成块数据的或者是数组的首地址。
----通道也可以传输单个字节,这个时候就要指出这个字节在内存当中的哪一个地址,或者是要把这个字节传输到内存当中的哪一个地址。另外,如果是一组数据,还要指出传输的字数、传输的方向、设备地址等等,这些参数都要有通道指令指出。
----这些指令一般会比较长,比如说IBM370他的通道指定的长度是64位。
总结: 通道的下面还可以带若干个子通道,子通道还可以并行的进行工作,每个子通道下面可以连接多个设备控制器,每个设备控制器还可以连接多个设备。
I/O硬件
I/O硬件包含了我们进行输入输出的设备,另外还有输入输出的接口。设备通过接口连接在总线上和主机完成信息交换。如果我们采用通道方式的话,那么设备连接的是设备控制器,设备控制器连接子通道,子通道连接通道。这就是我们简单的I/O系统的硬件的组成。
问题:CPU要启动I/O设备进行输入输出,那么主机和I/O设备如何进行联系?
I/O编址
I/O设备是有地址的,主机要和I/O设备之间进行联系的话,必须要给出I/O设备的地址,所以首先我们要对I/O设备进行编址。I/O设备的编制呢有两种方式:
①统一编址
所谓统一编址,就是把I/O设备的地址看成是内存地址的一部分。比如说我们内存地址一共是1M,那么我们把这1M地址当中它的低地址部分或者是高地址部分64K拿出来作为I/O设备的地址或者是端口的地址。如果输入输出指令或者是访存指令的地址码部分的地址落入到了IO地址部分,那么这次的输入或者是输出操作(也就是读写操作)实际上是针对I/O设备进行的。在这种情况下,CPU可以直接利用取数或者是存数指令对I/O设备进行访问、控制。
特点: 我们不需要单独的IO指令,只要取数指令或者是读数指令的地址码部分的地址落到了I/O地址部分,那么这条取数或者是读数指令就是对I/O设备进行操作的。因此这种方式,CPU系统的指令集会相对的简单。如果内存系统它的编址空间比较大的话,我们就可以采用统一编制的方式。比如说,内存地址我们采用的是64位,那寻址空间非常大,可以拿出一部分地址空间作为I/O设备使用。
②不统一编址(单独编制)
单独编制是指在内存地址空间之外专门设置一个地址空间。比如说内存的地址空间是20位,寻址范围是1M。对外部设备进行编址的时候,那么它的地址空间是从16个0到16个1,也就是64K。为了区分一条指令到底是对内存进行操作还是对I/O设备进行操作,在单独编址的计算机当中,输入输出指令就不能再采用计算机系统原有的取数或者是存数指令。我们要用专用的I/O指令来对I/O设备进行控制和操作。
设备选址
设备编完了地址以后,我们要进行选址。对于选址,我们是通过一个设备选择电路来识别某一个设备是否被选中。其实这个电路相当的容易,只要把CPU给出的地址和设备当中保存的自己的地址进行比较。如果两者是相同的,那这个设备呢就被选中了。设备被选中之后,就可以开始进行数据传输。
数据传送方式
在第三章当中,实际上我们已经介绍了数据传送方式。第一种方式就是串行,数据一位一位地进行传输,速度比较慢,但适合进行远程传输。第二种方式就是并行传输,同时有多位数据在数据线上进行传输,因此数据线有多条。通常情况下,数据线的条数是8的倍数。
联络方式
联络方式主要是反映外部设备接收或者发送数据它的响应情况,共有三种联络方式。
①立即响应方式
对一些结构简单的设备,状态数量也比较少,那么接收到或者是输入数据的话,可以直接进行显示。比如说,我们的一些LED灯接收到数据后,直接就可以用亮或者是不亮的方式来表示出它接收到的数据的值。
②异步工作
一般来说是采用应答信号的方式。异步又分为两种,可以并行传输,也可以串行传输。
----并行传输
。CPU和接口之间一般都是并行传输,所以我们现在讲的这种异步工作应答信号主要是I/O接口和I/O设备之间采用的。为了进行并行工作,I/O接口和I/O设备之间要有多条数据线组成的类似总线结构的数据线来完成数据并行的输入和输出。双方之间还要采用应答信号,比如说I/O设备要接收数据,IO端口把数据准备好以后,通过一个ready信号告诉I/O设备端口当中的数据已经准备好了。I/O设备对端口当中的数据进行读取,并且给出应答信号。如果是输入,I/O设备把数据通过I/O接口输入到CPU当中,或者输入到主机当中。IO接口当中的数据缓冲器一旦空了,它就会向I/O设备发送ready信号,告诉I/O设备可以向I/O接口当中发送数据。I/O设备向I/O接口发送数据并且给出应答信号。
----串行传输
。我们下图给出来的是串行数据的格式,前面是命令字,中间是数据字,后面的也是命令字。下图给出了一个例子,为了使串行异步的这种工作方式能够正确地进行工作,那么首先传输的时候要有一个起始位,9.09毫秒,一个低电平。在这个低电平结束之后是若干位的数据位,图中给出的是8位。数据位传输结束以后给出两位高电平的终止位,2乘以9.09毫秒,表示这次传输或者是数据结束。
③同步工作
这种方式前面也给大家介绍过,设备和主机之间如果要同步工作的话,必须有一个定宽定距的时标。通过这个定宽定距的时标来控制在某一个时间点必须开始某一项工作,在某个时间点某一项工作必须结束。这是我们介绍第四个问题,就联络方式我们介绍三种方法。立即响应。异步作。和同步工作
I/O设备和主机之间的连接方式
实际上这种连接方式我们在上面介绍I/O设备发展的时候就已经介绍过了。
①辐射式连接
第一种方式教材上把它叫做辐射式连接,实际上就是分散连接。主机和I/O设备进行分散式的连接,增加一个io设备,在主机当中就需要增加一套控制电路对这个设备进行控制。在早期的时候,由于外部设备的数量比较少,采用这种方式也是合适的。但随着计算机的发展,外部设备越来越多,如果采用这种方式的话每一台设备都给它配一套控制线路、一套信号线,会造成对主机系统增加或者是删除设备都非常麻烦。另外,为一台主机系统设计的设备要拿到另外的一台机器上去使用的话,这种可移植性也是非常弱的,所以不便于增删设备,也不便于设备的一致性。
②总线进行连接
外部设备通过接口和主机进行连接。接口能够向外部设备传送主机的控制命令,可以向主机传送外部设备的状态信息。同样,接口还可以完成数据缓存。外部设备的输入数据可以先缓存到接口当中,完成数据的格式、转换等操作,然后再输入到主机。或者是主机当中的数据在接口当中进行缓存,经过格式的变化等处理之后传输给外部设备。这种方式就特别便于增删设备,因为接口一般来说会采用标准的方式、或者是工业标准、或者是国际标准、或者是国家标准。只要外部设备它接入到接口或者接入到主机是采用标准接口的方式,就很容易实现外部设备和主机的连接,也很容易实现外部设备的可移植性。
前言
前面我们已经说了,控制方式有三种:
①程序查询方式。这是最早的一种方式,在这种方式当中,CPU和外设是采用串行方式进行工作。
②程序中断方式。在这种方式当中,CPU实现了和I/O设备之间部分的并行工作。也就是在I/O设备进行数据准备的时候,CPU还可以执行自己的程序,不需要停等。
③DMA方式。这种方式把CPU进一步地从数据的输入输出这个工作当中解放出来,使外部设备和内存之间可以建立直接的连接。由DMA控制器或者DMA接口直接控制外部设备和内存之间进行数据交换。
程序查询方式
我们以数据输入为例来介绍程序查询方式。如果我们要从某一个外部设备上读一批数据进入计算机的内存,我们看一下我们是怎么做的:
①首先CPU在程序当中要执行一条读操作指令,向I/O设备发出读命令。
②发出读命令以后,CPU开始读取I/O的状态(实际上是I/O接口当中状态触发器或者是状态标志的值),看数据是否被准备好。
③如果数据没有准备好,这里有一条跳转指令。CPU会不断的反复的去读这个状态标志,如果出错了,进入到出错处理。如果状态标志显示数据已经准备好了,这时CPU就可以从接口当中读出一个数据,这个数据可以是一个字节也可以是一个字。把这个字或者是字节读出来以后,放到CPU的某一个寄存器当中。
④然后再把这个寄存器当中保存的数据写入到内存的指定的位置。
⑤下一步判断这个传输是否结束,如果没有结束的话,CPU还会通过程序向I/O设备发出读指令。同样,读完以后CPU还是要查询I/O端口的状态,看数据是否已经准备好。如果没有准备好,那么CPU就会在这个地方进行循环往复的调整。
核心的部分:
一般来说外部设备的工作速度都比较慢,CPU的工作速度会很快。外部设备接收到CPU的指令以后开始数据准备,经过了一个较长的时间数据才能准备好。准备好以后把数据送入到I/O接口当中的数据缓冲,然后将工作状态标志置为设备准备好(或者数据准备好)。CPU只有查到了这个数据准备好之后才能够开始进行数据传输,通过接口把数据先读入到CPU当中的某一个寄存器,然后再从寄存器转存入某一个内存单元当中。在数据准备的过程当中,CPU一直处于原地踏步状态,没有去执行其他指令,没有去做其他的工作。这样的话,CPU的效率会非常的低。
总结: 内存和I/O之间要想进行数据交换的话必须要通过CPU。先要把数据送入到CPU当中,然后才能通过CPU把数据送入指定的目标,这个目标可能是外部设备,也可能是内存的某一个存储单元。在这种情况下,内存、CPU、IO三者之间的连接关系可以看作是CPU一手托两家,一边连接的是I/O接口,另外一边连接的是内存。信息交换必须通过CPU来做,外部设备比较慢,CPU速度比较快。在原地踏步的停等的这个过程当中,实际上消耗了CPU的大量的时间,造成CPU的效率非常低。
程序中断方式
前言
在这种方式当中,CPU被一定程度的从数据的输入输出工作当中解放出来。I/O设备的工作可以把它分成两个阶段,第一个阶段就是数据准备阶段(或者I/O设备进行自身的状态准备),第二个阶段是与主机交换信息。
描述
----在程序查询方式当中,I/O设备自身准备和与主机进行交换信息的时候,CPU都要工作。程序中断方式对程序查询方式进行了改进,在I/O设备(或者I/O端口)进行自身准备的时候,CPU不进行查询。只有当外部设备和内存之间开始进行信息交换或者和主机之间开始进行信息交换的时候,CPU才会暂停现行程序,把现行程序打断,然后为输入和输出进行服务,因此这种方式叫做中断方式。具体来讲,CPU执行主程序,在执行过程当中碰到了一个I/O指令,执行这个I/O指令,启动I/O设备,进行数据准备。可能是数据输入,也可能是数据输出。发出启动设备的指令以后,CPU继续执行原来的程序。外部设备接收到了启动设备的命令,外部设备开始进行状态准备。当外部设备准备好接收或者是输入数据以后,他就会向CPU提出一个中断请求,让CPU能够停止对当前程序的执行,转而和 I/O设备进行数据交换。
----我们这个图上假设CPU在执行第K条指令的过程中收到了外部设备已经准备好发来的中断请求信号,CPU在执行完第K条指令以后把这个程序断点和相关的程序现场进行保存,然后跳转到中断服务程序。通过执行这个中断服务程序来完成数据的输入和输出操作。中断服务程序执行完数据的输入输出操作,这一次的也就执行完了。CPU又转回到执行原来的程序。原来是在第K条指令执行结束之后,开始处理中断服务程序。因此转回的时候,恢复相关寄存器的内容,然后从K+1开始继续执行原来的程序。
特点: 这样的话我们可以看出,在设备自身准备阶段,CPU没有踏步等待,只有到真正的进行数据传输了,由外部设备主动的发起中断请求信号请求CPU协助完成数据的输入和输出操作。在这种方式当中,我们可以看到外部设备进行自身准备的时候,CPU依然在执行主程序。在程序查询方式当中,这部分时间CPU是进行踏步等待。在数据的输入和输出过程当中,真正的要进行传输了,CPU才会暂停掉现行的程序,转而进行输入输出操作。那么这种方法使CPU和I/O可以部分的并行进行工作,CPU被一定程度的解放出来。但是对CPU的解放其实并不是非常的彻底,因为传输过程当中仍然需要CPU的参与,而且要保证程序被中断掉以后,返回之后能够正确的执行。中段的时候要保护现场保存程序断点,程序返回的时候要恢复现场,恢复程序的断点。这些都是要有指令来完成的,需要一定的时间。如果外部设备和内存之间或者是和主机之间进行信息传输的数据量非常小,比如说只传输一个字节,可能会需要十几条甚至几十条指令来完成现场的保护或者是现场的恢复工作,依然要消耗CPU较大的时间。
流程图
①CPU向I/O发出读指令,我们以读作为例子。
②CPU发出这个I/O的读指令之后,CPU的工作和I/O的工作开始并行进行,CPU继续执行原来的程序。
③I/O设备开始进行设备的准备工作,一直到准备就绪。
④之后由I/O设备向CPU发出中断请求,CPU读取I/O的状态,确定到底是哪一个设备发出了中断请求。
⑤然后CPU检查状态是不是出错,如果出错就进行出错处理,如果没有出错,CPU从I/O接口当中读一个字送到CPU,然后再把这个字写入到内存当中。
⑥进行进一步的判断,看这个输入输出工作是否已经完成。
⑥如果已经完成,就作结束处理。如果没有完成,CPU向I/O发出读下一个字的操作。
DMA方式
前言
在程序查询方式当中,我们说了内存、CPU和外设之间的连接关系。实际上在程序中断方式当中,要想输入一个数据到内存中去,依然是先要把这个数据读入到CPU,然后CPU再把数据写入到内存或者是发给I/O设备。从这种方式来说,中断方式内存、CPU、IO设备之间的连接关系依然是CPU在中间,内存和外设在两边,内存和外设之间要想进行信息传输必须要有CPU的参与。
描述
DNA方式可以进一步把CPU从数据输入和输出工作中解放出来。这种方式在内存和I/O之间建立了直接的通路,内存I/O通过DMA控制器可以直接进行数据交换。这样,在数据交换的过程当中也不需要CPU的参与了,不需要中断现行程序的执行,采用的方式叫做周期窃取(周期挪用)。因为DNA控制器控制主存和外设之间进行信息交换,那么一定要使用到总线,包括地址线、数据线、控制线。这些总线。如果DMA利用它们进行信息交换的话,那么CPU就要把总线的控制权让出来,让出的时间就是一个存取周期。在这个存取周期当中,如果DMA需要完成I/O和内存之间的数据交换,那么这个主存周期就交给DNA使用。同样,总线的控制权也交给DMA,这种方式我们把它叫做周期挪用或者是周期窃取。
----我们看一下我们上面的这个图,这个图说明了CPU和外设之间工作的并行性。从一开始,CPU一直在执行主程序。在主程序当中碰到了I/O指令,要进行输入或输出,CPU发出启动I/O的指令。发出这个指令之后,CPU继续执行自己的操作。I/O设备在DMA控制器的控制之下完成数据的准备。当数据准备好以后,要进行数据传输了。由DMA控制器发出DMA请求,占用总线的使用权,占用一个存取周期。利用这一个存取周期进行外部设备和内存之间的数据交换。在这一个存取周期当中,CPU不能够使用总线对内存进行访问。这个周期结束以后,I/O设备可以继续的进行准备,CPU可以继续的去执行现行的程序。也就是说,这个周期结束之后,总线的控制权对内存的使用权又归还给了CPU。
----在这一个存取周期当中,CPU虽然不能够使用系统的总线,不能够使用内存,不能进行访存操作,但是在这个周期当中,CPU还是可以执行的。比如说,现代处理器并不是CPU每需要执行一条指令就从内存当中取一条指令。指令是要预取的,在指令执行之前,可能若干条指令已经被预取到CPU的指令缓冲当中。只要这些指令不需要访存,或者是在这个存取周期当中不需要保存,CPU就可以利用缓存当中的指令和数据继续执行主程序当中的指令。
那么在这一个存取周期当中,是让CPU的操作和DMA控制器或者是外部设备的操作也是可以并行操作的。
----和中断方式相比,在数据传输的过程当中,不需要保存现场,不需要恢复现场,不需要去执行中断服务程序,不需要用软件来完成数据输入和输出操作的控制。
控制方式对比
注: 那么前面我们介绍了程序查询方式、、程序中断方式、DMA方式。实际上后面还有通道方式和I/O处理机方式。随着I/O技术的发展,随着时间的推移,I/O系统的自治能力会越来越强。
I/O设备概念
I/O设备就是外部设备,通过接口电路和主机进行连接。外部设备包括了两大部分:其一是设备控制器,另外就是外部设备的机、电、磁、光这些部分。外部设备通过I/O接口和主机之间进行数据的交换,主机通过I/O接口向设备控制器传输控制命令,控制外部设备进行相关的操作。同样,主机通过I/O接口来读取外部设备的状态,比如说外部设备是忙还是已经准备好等等,这些操作都要通过I/O接口来完成。
I/O设备分类
①人机交互设备。包括了输入设备和输出设备,这类设备主要是把人能够识别的信息转换成计算机能够识别的信息,并且把它输入到计算机当中去。或者是把计算机当中的二进制信息转换成人能够识别的文字、图象、声音等信息,通过外部设备输出。像我们常用的键盘、鼠标、打印机、显示器都是人机交互设备。
②计算机信息存储设备。在第四章存储器中,像磁盘、磁带、光盘这些设备是存储系统的一部分,也是计算机系统的外部设备。我们需要的各种类型的信息、文档、影视资料都可以保存在磁盘、光盘和磁带上。同样,磁盘、光盘和磁带也是需要通过I/O接口和主机之间进行联系的。
③机-机通信设备。比如说调制解调器,还有我们用到的网卡,都是计算机和计算机之间或者是计算机和某一种设备之间进行信息交换的通信设备。
输入设备
输入设备就是要把人能够识别的信息输入到计算机当中的设备
①键盘。我们要判断是否有键按下,然后根据哪个键被按下,我们把和这个键相对应的ASCII码输入到计算机当中。我们常用的键盘是编码键盘,大家可以看一下教材169页图5.15。这个图给出了编码键盘的结构和工作原理。编码键盘结构上非常简单,把若干个键排列成矩阵,然后用一个计数器经过行译码、列译码以后对键盘进行扫描,确定到底是哪一个键被按下去了。一旦扫描到某一个键被按下去了,计数器的计数就会停止,同时可以把计数器的输出作为一个ROM的输入地址。这个ROM当中就保存了键盘上每个键对应的ASCII码,CPU把这个ASCII码可以进行读入,这个读入是通过中断方式进行。CPU的读入指令或者读入操作经过一段时间延迟以后,可以输入到中断控制装置,来清除中断标记,可以用于再一次启动计数器,使计数器再次对键盘进行扫描,为下一个字符的输入做准备。
②鼠标。常用的鼠标有机械式的还有光电式的。另外就是触摸屏,原来触摸屏的应用比较少,现在几乎每个人使用的手机都使用了触摸屏。
输出设备
①显示器
我们的图形、图像、字符都是通过显示器进行显示。实际上显示器有三种类型,大家现在见到的可能都是第三种能够支持图像进行显示的。
----字符显示。早期的显示器只能支持字符显示,显示器里面有字符发生器,把ASCII码转换成相应的一个字符变成一个阵列在显示器上显示出来。
----图形显示。图形显示出来的是主观图像。主观图像就是我们人工的方式在计算机上画的或者是通过程序在计算机上画的那些由点、线、面构成的图形。
----图像显示。现在的显示器几乎绝大多数都支持图像显示,你可以把照片、视频放在显示器上做显示。
②打印机
打印机分了若干种,如果按是否使用打击方式进行打印的话,它可以分为两种。
----击打式。一种是打击式的,这种打印机在15到20年前非常流行,也叫做针式打印机。它是把字符点阵通过色带和纸把它打印出来。这种打印机包括了逐字打印和逐行打印两种。从打印纸的宽度还可以把它分成窄行打印机和宽行打印机。实际上现在这种打印机应用也比较多。目前各种类型的票据打印机,比如说我们坐出租车的时候打印出来的出租车发票。出租车发票的打印机就是打击式的针式打印机。
----非击打式。非击打式的打印机包括激光打印机和喷墨打印机两种类型。
其它
①A/D D/A(模数/数模转换器)
计算机内部使用的都是数字信号。如果计算机要对外部设备进行控制或者是把信号进行远程的传输,需要使用设备把计算机控制的数字信号转换成模拟信号,传输给设备进行控制或者是进行远程的传输,在接收端再利用模拟信号转成数字信号进行接收。同样外部设备的状态信息或外部设备对主机的输入可能是采用模拟信号方式,那么要输入到计算机当中必须要转换成计算机能够识别的数字信号,那我们就需要A/D设备,把模拟信号转换成数据信号。
②终端
终端一般来说是由显示器和键盘构成。但是终端上面带的不仅仅是一个显示器和键盘,还有一些控制机构、缓存等等,类似于我们现在常说的瘦客户机,它能够完成显示控制与存储、键盘管理、通信控制。终端一般来说不能进行单独使用,要通过一些连接线和远程的主机进行连接才能够使用。
③汉字处理
汉字输入要有输入码,在计算机内部进行存储要有内码进行处理。要进行显示的话,要有字母码进行输出。
多媒体技术
多媒体实际上是从英文直接翻译过来的。所谓多媒体就是多种媒体技术和手段相结合进行综合应用,给人以更多的是听或者是动作上的感受。多媒体技术现在应用很多,比如说虚拟现实技术。像我们的飞行员在飞一个新的机型的时候,要使用飞行模拟器进行训练。多媒体的关键技术包括数据的压缩、解压缩、编码技术、专用的芯片、语音的识别、图片的识别等等。
接口的定义
接口这个词它的含义非常广泛,可以用在软件模块和软件模块之间、可以用在硬件和硬件之间、也可以用在软件和硬件之间。有一本非常有名的计算机组成原理的教材叫做
计算机组织与设计-硬软件接口技术
。所谓硬件和软件之间的接口,实际上就是计算机硬软件的交界面,也就是计算机系统结构。我们主要讲主机和I/O设备之间的接口,这个接口既包括了接口电路硬件,也包括了控制软件。
为什么要使用接口
①在第三章我们已经讲过了,我们是采用总线的方式来完成外部设备和系统主机之间的连接。外部设备要有地址,主机通过地址来确认这次是和哪个设备进行数据传输。所以对于接口,我们首先要实现设备的选择以确认哪个设备参与本次输入和输出操作。
②外部设备类型多样,工作速度差异也非常大。有的速度比较快,比如说硬盘。有的速度非常慢,比如说键盘,可能很长时间才能输入一个字节的数据。要通过接口实现数据缓冲达到数据匹配的目的。
③实现数据格式的转换。接口和主机之间采用并行传输,一次传输一个字节或者是一个字。外部设备和接口之间可能会采用串行传输,一位一位地传。数据要在接口当中完成组装或者是拆解,做格式转换。
④实现电平的转换。主机和I/O设备工作的电平不一致,通过I/O接口完成电平的转换,使主机和I/O设备能够协调地进行工作。
⑤通过接口来传送控制命令。CPU把控制命令传输到接口当中,由这个命令来控制外部设备进行工作。
⑥接口当中要有一些状态标志,由这个状态标志来标明外部设备是忙还是闲、是否已经准备好、外部设备是否有中断请求。那么为了完成这些功能,我们需要在主机和外部设备之间加上接口。
接口的组成
实际上我们刚才介绍的六点就是接口的功能,这些功能决定了接口硬件电路的结构。通过总线方式连接的I/O接口电路的接口如下所示,这个图上把主机部分隐掉了。
主机通过I/O总线和外部设备和接口进行连接,总线我们可以把它分成四种类型:
①设备选择线。这条线上传输的是参与本次信息交换的设备的设备码(或端口号),实际上就是设备的地址(或端口的地址)。这个地址传输给I/O接口,在IO接口当中进行匹配,看是否是这个接口上连接的某个设备要参与这次数据传输。所以这条线是单向的线。
②数据线。通过这条线来完成数据的输入和输出,它的条数和接口的类型有关系。这条线是双向的。
③命令线。来自主机的命令通过命令线输入到I/O接口当中,命令经过缓冲和译码以后可以控制设备做相应的输入或者输出操作。
④态线线。状态线也是单向的,从I/O接口送到I/O总线,进而送到主机。由主机来了解外部设备的工作状态是忙还是准备好或者是出错,都是通过状态线进行传输的。
接口的功能和组成
刚才讲了I/O接口的六项功能,我们将其稍作简化,我们假设要设计的接口有下面的四个功能:
①选址。所谓选址就是确认某一个设备是否就是给定的要参与本次数据传输的这个设备。
②传送命令。
③传送数据。要接收来自主机的命令,并且把命令进行锁存。核心的功能就是的功能。
④反应设备状态的。
根据这些功能我们可以给出接口的组成:
①选址的功能通过设备选择电路
来完成,在逻辑实现上说就是一个比较器。
②传送命令的功能可以通过命令寄存器
把命令进行锁存,通过命令译码器发出控制信号,控制接口和外部设备完成相应的功能。
③传送数据的功能需要有一个数据缓冲寄存器
来完成。实际上这个数据缓冲寄存器我们稍加改进就可以变成并串转换或者是串并转换的电路。
④反应系统的状态,我们使用的是设备状态标记
,利用一系列的触发器来进行实现。我们看我们需要反应设备的哪些状态:
----第一个状态就是完成触发器D,用于标记设备是否准备好,数据是否准备好。D=1表示准备工作已经完成,D=0表示准备工作尚未完成.
----第一个状态就是工作触发器B,用来标识外部设备工作状态是否忙。比如说B=1表示外部设备忙,B=0表示外部设备已经完成工作是闲。
----前面我们讲过中断方式,它是设备准备好以后主动向主机提出中断请求。因此,接口当中要有中断请求触发器INTR。
----另外,接口可能有中断请求,但是是否允许它向主机提出中断请求要看设备中断请求的重要性。因此,我们在接口当中设置了屏蔽触发器MASK。如果MASK=1,表示尽管设备已经完成了工作,依然不能向主机或者向CPU发出中断请求,因为当前主机所处理的工作的重要性比这次输入输出操作的重要性要大。
I/O的基本组成框图
根据前面分析的I/O接口的功能和组成,我们可以给出I/O接口的一个基本的组成框图(如果加上数据的转化和电平的转换,这个框图可以进一步的进行复杂化,这里不再赘述)。我们可以把I/O接口的基本组成分成五大模块:
①设备选择电路。确定是否是某一个设备要参与给定的输入或者是输出操作。
②命令寄存器和命令译码器。确认本次操作是输入操作、输出操作还是其他类型的操作。
③数据缓冲寄存器DBR。是数据、缓冲、寄存器三个词的缩写。
④标记系统的状态标记。由一系列的触发器来完成。
⑤上面四大部分的主要电路要协调地按时序地进行工作就需要一个控制逻辑电路。
----接口给出以后,一端可以连接CPU,另外一端就可以连接外部设备。
----CPU和接口之间的连接包括了数据线(双向的,一般是并行传输)、地址线(给出的是外部设备的地址,供设备选择电路使用)、命令线(给出操作命令,放在命令寄存器当中进行锁存,进而进行译码,并且在时序电路的控制下给出各个操作以及操作之间的时间关系)、状态线(把I/O接口的状态、外部设备的状态传输给CPU)
----右侧就是外部设备,通过数据线、命令和状态与I/O接口进行连接。数据线传输接口和设备之间进行数据传输。命令来自于命令译码器和时序逻辑,控制外部设备做相应的工作。状态是外部设备的状态,把它进行输入,对状态标记进行置位或者是复位。
接口类型
接口的类型实际上就是对接口进行分类。给出一个标准,就有一个分类方法。我们来看一下标准:
①按照数据传送方式进行分类
我们前面讲数据传送方式,包括了并行和串行。实际上,接口类型也包括了并行接口和串行接口。比如说Intel 8255芯片就是并行接口芯片,Intel 8251芯片就是串行接口芯片。
②按照功能选择的灵活性分类。
第一种是可编程的接口,它的功能和工作方式可以通过编程的方式进行设置,比如说Intel 8255芯片。还有不可编程的接口,不能通过软件的方式来设置接口的功能和工作方式,典型的芯片就是Intel 8212芯片。
③按照通用性分类。
把多种类型接口中通用的电路做到一个芯片当中,就形成了一个通用的接口。比如说我们前面提到的8255、8251就是通用的接口。另外就是专用接口,只能用于主机和某一种类型的设备进行连接,Intel 8279、Intel 8275都是专用接口。
④按照数据传送的控制方式分类。
我们前面详细地介绍了三种数据传送的控制方式。程序查询方式不需要接口进行控制。那么还有两种。中断方式和DMA方式。那么中断方式有中断的接口,DNA方式有DNA的接口。
单个设备的程序查询流程
如果在传输过程当中只有一个设备参与内存和I/O之间数据传输,在执行程序的过程当中,CPU会执行到一个输入输出指令,由这个输入输出指令发出启动设备的命令。相应的设备接收到这个命令以后,就开始进行数据准备。数据准备好以后,再传输给CPU。CPU再发出设备启动命令之后就开始检查状态标记,看I/O接口当中的数据是否已经准备好,设备是否已经准备好进行输入和输出。如果准备就绪,就进行数据交换。如果没有准备就绪,CPU就处于一种踏步状态通过循环的方式检查状态标记,直到设备准备好,开始交换数据为止。
在这个过程当中,我们要使用三条指令。第一条指令负责检查状态标记,主要是一条测试指令。在检查设备是否准备就绪的时候,要使用到的指令就是一条转移指令(或分支指令)。交换数据我们使用的是数据传送指令(或输入输出指令、访存指令)。
多个设备的程序查询流程
程序查询流程
如果有多个设备都要通过程序查询方式和CPU进行数据交换,即都要通过程序查询方式和内存进行交换,那我们需要把参与传输的这些设备根据优先级进行排序。优先级越高的设备被查询到的时间就越早。
设备1的优先级最高,CPU检查设备1的状态标记,看它是否已经准备就绪。如果准备就绪,就处理设备1和内存之间的信息交换。如果没有准备就绪,它会去检查次优先级的设备,比如说设备2,按照优先级的先后顺序逐步地向后进行检查,完成数据的输入输出。
程序流程
根据这个流程我们就可以设计一个程序流程来实现程序查询的过程。
①首先,我们要保存寄存器的内容,因为程序查询方式要完成内存和外部设备之间的数据输入输出,需要借助CPU当中的某一个寄存器对数据进行暂存。如果这个寄存器当中的数据是有用的,那我们要对这个寄存器当中的数据进行保存。你可以把它写入到某一个内存单元当中,把它压入到堆栈当中,或者是把它放到CPU当中的其他的闲置的寄存器当中保存。
②保存这个内容之后我们要设置计数器的值。设置计数器的值的目的是为了控制我们传输的数据量,这次内存和I/O之间进行数据传输,到底传输多大量的数据。计数值的设置有两种方式。
----第一种方式,如果我们要传输N个字,计数器的值我就把它设成N。每完成一个字的传输,计数器的值就减一,直到减到0为止就完成了这个数据的传输。
----另外一种设置方法是我们把这个计数器的值给它设成-N。并且这个负数我们用补码来表示,关于补码我们在第六章当中会进行介绍。每传输一个字,我们给计数器的值加1,直到计数器发生溢出,计数器当中的值变成零数据传输才会结束。
③设置了计数值之后,为了完成内存和io之间数据传输,我们要知道内存的这个块儿它的起始地址是什么。所以我们要设置主存缓冲区的地址。我们保存数据或者是读取数据就从这个缓冲区的起始地址或者首地址开始。
④这两个设置完我们就可以启动外部设备,让外部设备进行准备和进行数据传输。
⑤启动设备以后,因为我们是程序查询方式,CPU开始查询I/O接口的状态或者是设备的状态,看是否准备好。如果没准备好,CPU就通过这种原地踏步的方式反复的进行查询,一直到状态标志表明数据已经准备好了这个查询操作才会停止。
⑥开始进行数据传输,传送一个字。
⑦这个字传送完以后,我们前面设置的一些初始值要进行修改,比如说内存的地址。我们需要修改,加1或者减1,为输入或者输出下一个数据做准备。
⑧同时,为了表明我们还有多少数据需要进行传输,计数器的值也要进行修改,把它加1或者是减1。这个要看你这个计数值在寄存器当中是如何进行设置的。
⑨然后判断这批数据是不是已经传输完了。如果没有传输完,CPU要再一次启动外设,循环进行这个过程直到数据传输完,我们就结束这个I/O传输。
程序查询方式的接口电路
上面是程序的流程,程序员编写一个程序,要用程序查询的方式完成数据输入输出。在它的应用程序当中,就需要把这个程序流程嵌入进去,由这段程序来完成数据的输入和输出操作。根据这个流程以及我们在5.3中已经讲解过的I/O接口电路的基本结构,我们可以给出或者分析得到程序查询方式的接口电路。5.3当中我们介绍了I/O接口的基本组成有五部分电路,我们可以对应分析一下程序查询方式的接口电路和那五部分的电路它们之间的对应关系。
程序查询方式的电路
①最下面是设备选择电路,由它来确认一个设备是否就是参加这次传输的这个设
②如果SEL这个信号有效,并且启动命令是有效的,那I/O接口就会开始工作。下面我们以数据的输入为例(所谓输入是指把外部设备当中的数据输入到主机当中,输入到内存的某一个存储单元当中)。
③CPU通过地址线给出外部设备的地址。设备选择电路把自己的设备地址或者是端口号和地址线上的地址进行比较,如果相同说明这次启动的就是连接在这个接口电路上的设备,SEL这个信号会有效。启动命令和SEL这个信号都有效的前提下,我们对两个状态标记进行置位或者是复位。
④到目前为止是CPU发出读命令,设备还没开始工作。因此标记D应该为0,表示数据还没有准备好。标记B应该被置为1,表示设备开始工作,设备处于忙的状态,B这个标记会去启动设备。
⑤设备接收到B的标记信号之后以及启动命令这个信号之后,设备开始工作,把数据准备好,并且数据通过输入的数据线把它保存到DBR这个数据缓冲当中。
⑥这时,设备的工作结束。设备会通过设备的状态线向接口电路送入设备工作结束信号,这个信号会修改接口电路当中的两个标记。这个时候标记D的值应该被修改为1,表示数据已经准备好了.同时标记B被改为0,表示设备已经工作完成,不忙了。D这个信号(准备就绪信号)被送出。
⑦在我们刚才讲解的整个过程当中,一直到D这个信号变成1之前,CPU都在原地踏步的进行查询,它查询的信号就是这个D,看D是否等于1。只要D不等于1,它就一直查,查询到D这个信号等于1了,说明数据已经被放入的DBR当中了,CPU可以进行数据传输,CPU就通过数据线把这个数据进行读入,那这个工作过程也就结束了。
注:这个接口电路的结构非常的简单,实际上大家真正设计的时候,接口电路要比这个复杂。比如说,我们要对CPU传来的命令进行锁存、对命令进行译码。在时序电路的控制下,按照顺序产生一系列的控制信号,控制接口和IO设备进行相应的工作。