I/O 端口是指接口电路中可被 CPU 直接访问的寄存器,主要有数据端口、状态端口和控制端口,若干端口加上相应的控制逻辑电路组成接口。通常,CPU 能对数据端口执行读写操作,但对状态端口只能执行读操作,对控制端口只能执行写操作。I/O 端口要想能够被 CPU 访问,就必须要对各个端口进行编号,每个端口对应一个端口地址。而对 I/O 端口的编址方式有与存储器统一编址和独立编址两种。
统一编址:又称存储器映射方式,是指把 I/O 端口当作存储器的单元进行地址分配,这种方式 CPU 不需要设置专门的 I/O 指令,用统一的访存指令就可以访问 I/O 端口。
优点:不需要专门的输入/输出指令,可使 CPU 访问 I/O 的操作更灵活、更方便,还可使端口有较大的编址空间。
缺点:输入/输出指令少,一般只能对端口进行传送操作,尤其需要 CPU 提供存储器读/写、I/O 设备读写两组控制信号,增加了控制的复杂性。
三、I/O 方式
输入/输出系统实现主机与 I/O 设备之间的数据传送,可以采用不同的控制方式,各种方式在代价、性能、解决问题的着重点等方面各不相同,常用的 I/O 方式有程序查询、程序中断、DMA 和通道等,其中前两种方式更依赖于 CPU 中程序指令的执行。
0x00 程序查询方式
信息交换的控制完全由 CPU 执行程序实现。程序查询方式接口中设置一个数据缓冲寄存器(数据端口)和一个设备状态寄存器(状态端口)。主机进行 I/O 操作时,先发出询问信号,读取设备的状态并根据设备状态决定下一步操作究竟是进行数据传送还是等待。
程序查询方式的工作流程如下(见图 7.2):
CPU 执行初始化程序,并预置传送参数。
向 I/O 接口发出命令字,启动 I/O 设备。
从外设接口读取其状态信息。
CPU 不断查询 I/O 设备状态,直到外设准备就绪。
传送一次数据
修改地址和计数器参数。
判断传送是否结束,若未结束,转第3步,直到计数器为0。
在这种控制方式下,CPU 一旦启动 I/O,就必须停止现行程序修改传送参数的运行,并在现行程序中插入一段程序。程序查询方式的主要特点是 CPU 有“踏步”等待现象,CPU 与 I/O 串行工作。这种方式的接口设计简单、设备量少,但 CPU 在信息传送过程中要花费很多时间来查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低。
程序中断方式的思想:CPU 在程序中安排好在某个时机启动某台外设,然后 CPU 继续执行当前的程序,不需要像查询方式那样一直等待外设准备就绪。一旦外设完成数据传送的准备工作,就主动向 CPU 发出中断请求,请求 CPU 为自己服务。在可以响应中断的条件下,CPU 暂时中止正在执行的程序,转去执行中断服务程序为外设服务,在中断服务程序中完成一次主机与外设之间的数据传送,传送完成后,CPU 返回原来的程序,如图 7.3 所示。
2. 程序中断的工作流程
中断请求:中断源是请求 CPU 中断的设备或事件,一台计算机允许有多个中断源。每个中断源向 CPU 发出中断请求的时间是随机的。为记录中断事件并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器,当其状态为“1”时,表示中断源有请求。这些触发器可组成中断请求标记寄存器,该寄存器可集中在 CPU 中,也可分散在各个中断源中。通过 INTR 线发出的是可屏蔽中断,通过 NMI 线发出的是不可屏蔽中断。可屏蔽中断的优先级最低,在关中断模式下不会被响应。不可屏蔽中断用于处理紧急和重要的事件,如时钟中断、电源掉电等,其优先级最高,其次是内部异常,即使在关中断模式下也会被响应。
中断响应判优:中断响应优先级是指 CPU 响应中断请求的先后顺序。由于许多中断源提出中断请求的时间都是随机的,因此当多个中断源同时提出请求时,需通过中断判优逻辑来确定响应哪个中断源的请求,中断响应的判优通常是通过硬件排队器实现的。一般来说:
按图 7.6 所示的时间轴给出的 4 个中断源的请求时刻,画出 CPU 执行程序的轨迹。设每个中断源的中断服务程序时间均为 20 us。
解:
在中断处理次序改为 D>A>C>B 后,D 具有最高优先级,可以屏蔽其他所有中断,且不能中断自身,因此 D 对应的屏蔽字为 1111;A 具有次高优先级,只能被 D 中断,因此 A 对应的屏蔽字为 1110,以此类推,得到 4 个中断源的屏蔽字,见表 7.1。
中断源
屏蔽字
A
1110
B
0110
C
0110
D
1111
根据处理次序,在时刻 5,B 发中断请求,获得 CPU;在时刻 10,D 发中断请求,此时 B 虽还未执行完毕,但 D 的优先级高于 B,于是 D 中断 B 而获得 CPU;在时刻 30,D 执行完毕,B 继续获得 CPU;在时刻 35,A 发中断请求,此时 B 虽还未执行完毕,但 A 的优先级高于 B,于是 A 中断 B 而获得 CPU,如此继续下去,执行轨迹如图 7.7 所示。
0x02 DMA 方式
DMA(Direct Memory Access)方式是一种完全由硬件进行成组信息传送的控制方式,它具有程序中断方式的优点,即在数据准备阶段,CPU 与外设并行工作。DMA 方式在外设与内存之间开辟一条“直接数据通道”,信息传送不再经过 CPU,降低了 CPU 在传送数据时的开销,因此称为直接存储器存取方式。由于数据传送不经过 CPU,也就不需要保护、恢复 CPU 现场等烦琐操作。这种方式适用于磁盘、显卡、声卡、网卡等高速设备大批量数据的传送,它的硬件开销比较大。在 DMA 方式中,中断的作用仅限于故障和正常传送结束时的处理。
在 DMA 传送过程中,DMA 控制器将接管 CPU 的地址总线、数据总线和控制总线,CPU 的主存控制信号被禁止使用。而当 DMA 传送结束后,将恢复 CPU 的一切权利并开始执行其操作。由此可见,DMA 控制器必须具有控制系统总线的能力
3. DMA 的传送方式
主存和 I/O 设备之间交换信息时,不通过 CPU。但当 I/O 设备和 CPU 同时访问主存时,可能发生冲突。为了有效地使用主存,DMA 控制器与 CPU 通常采用以下 3 种方式使用主存:
使 CPU 脱离总线:停止访问主存,直到 DMA 传送一块数据结束。数据传送结束后,DMA 控制器通知 CPU 可以使用主存,并把总线控制权交还给 CPU。
周期挪用(或周期窃取):当 I/O 设备有 DMA 请求时,会遇到 3 种情况:
CPU 不在访存(如 CPU 正在执行乘法指令),I/O 的访存请求与 CPU 未发生冲突;
CPU 正在访存,此时必须待存取周期结束后,CPU 再将总线占有权让出;
I/O 和 CPU 同时请求访存,出现访存冲突,此时 CPU 要暂时放弃总线占有权。I/O 访存优先级高于 CPU 访存,因为 I/O 不立即访存就可能丢失数据,此时由 I/O 设备挪用一个或几个存取周期,传送完一个数据后立即释放总线,是一种单字传送方式。
DMA 与 CPU 交替访存:这种方式适用于 CPU 的工作周期比主存存取周期长的情况。例如,若 CPU 的工作周期是 ,主存的存取周期小于 ,则可将一个 CPU 周期分为 和 两个周期,其中 专供 DMA 访存, 专供 CPU 访存。这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过 和 分时控制的。