目录


文章目录



输入输出系统

中央处理器和主存储器构成了计算机的主体,称为主机。主机以外的大部分硬件设备都称之为外部设备,简称外设或 I/O 设备,包括网卡设备、辅助存储设备。

输入输出系统就是由外设硬件(e.g. NIC)及其与主机之间的控制部件(NIC Controller)所构成,其中,控制部件常被称为设备控制器、设备适配器、设备驱动程序、或 I/O 接口,主要负责控制并实现主机与外设之间的数据传输。

设备控制器

设备控制器,例如:NIC Ethernet Controller(以太网网卡设配器),又称设备驱动程式,是计算机中的一个实体,其主要职责是控制一个或多个 I/O 设备,以实现 I/O 设备和主机之间的数据交换。

设备控制器是 CPU 与 I/O 设备之间的接口,接收从 CPU 发来的命令,并去控制 I/O 设备工作,以使处理机(包括中央处理器,主存储器,输入/输出接口)从繁杂的设备控制事务中解脱出来。三者间的逻辑关系为:

CPU <==> 设备控制器 <==> 外部设备

设备控制器的作用


  1. 实现主机和外设之间的 ​数据传输​。其中包括设备选择、数据传达、同步控制和中断控制。
  2. 实现 ​数据缓冲​。使主机和外设之间的处理速度尽量能够保持一致。数据传输时,先将数据送入数据缓冲寄存器,然后再送到目的外设或主机。
  3. 提供外设接口状态,接收主机的指令并按照指令控制外设​。

设备适配器的接口类型

按照数据传输的宽度可以分为:


  • 并行接口​:外设和接口都是将一个 Byte 的所有位同时传输的。
  • 串行接口​:外设和接口间的数据是一个一个 Bit 串行传输的,而接口和主机之间是按 Byte 并行传输的,所以接口要完成串行到并行的数据格式转换。

按照数据控制方式可以分为:


  • 程序控制 I/O 接口​。
  • 程序中断 I/O 接口​。
  • DMA(直接存储器存取)接口​。

设备适配器的基本功能


  • 接收和识别命令​:CPU 可以向设备控制器发送多种不同的命令,设备控制器能够接收并识别这些命令。例如,磁盘控制器可以接收 CPU 发来的 Read、Write、Format 等 15 条不同的命令,而且有些命令还会带有参数。所以,在磁盘控制器中会存在 ​指令寄存器​ 和 ​指令译码器​ 等,用来存放接收的指令和参数,并对所接收的指令进行译码。
  • 地址识别​:就像内存中的每一个单元都有一个地址一样,系统中的每一个设备也都有一个地址,而设备控制器又必须能够识别它所控制的每个设备的地址。此外,为使 CPU 能对寄存器存取数据,这些寄存器都应具有唯一的地址。例如,在 IB-MPC 机中规定,磁盘控制器中各寄存器的地址分别为 320~32F 之一。控制器应能正确识别这些地址,为此,在控制器中应配置 ​地址译码器​。
  • 数据交换​:指实现 CPU 与硬件控制器之间、硬件控制器与外部设备之间的数据交换。对于前者,是通过数据总线完成的,由 CPU 并行地把数据写入硬件控制器,或从硬件控制器中并行地读取数据;对于后者,是外部设备将数据输入到硬件控制器,或从硬件控制器传送给外部设备。为此,在控制器中须设置 ​数据寄存器​。
  • 标识和报告设备的状态​:控制器应记下设备的状态供 CPU 了解。例如,仅当该设备处于发送就绪状态时,CPU 才能启动控制器从设备中读出数据。为此,在控制器中应设置 ​状态寄存器​,用其中的每一位来反映设备的某一种状态。当 CPU 将该寄存器的内容读入后,便可了解该设备的状态。
  • 数据缓冲​:由于 I/O 设备的速率较低而 CPU 和内存的速率却很高,故在硬件控制器中必须设置 ​数据缓冲寄存器​。在输出时,用此缓冲器暂存由主机高速传来的数据,然后才以 I/O 设备所具有的速率将缓冲器中的数据传送给 I/O 设备;在输入时,缓冲器则用于暂存从 I/O 设备送来的数据,待接收到一批数据后,再将缓冲器中的数据高速地传送给主机。
  • 差错控制​:设备控制器还负责对由 I/O 设备传送来的数据进行差错检测。若发现传送中出现了错误,通常是将差错检测码置位,并向CPU报告,于是CPU将本次传送来的数据作废,并重新进行一次传送。这样便可保证数据输入的正确性。

设备控制器的组成

设备控制器构成及工作原理都与 CPU 非常相似,均由:


  • 程序计数器(Program Counter)
  • 指令寄存器(Instruction Register)
  • 指令译码器(Instruction Decoder)
  • 标志寄存器(Flags Register)
  • 定时与控制电路(Programmable Logic Array)
  • 脉冲源
  • 中断处理
  • 堆栈
    等组件构成。

在微机和小机中的设备控制器,通常被做成印刷电路卡形式,因而也常称为接口卡,可将它插入计算机主板。最常见的外设及其设备控制器莫过于磁盘驱动器和网卡了,他们都由硬件设备和相应的 Controller 组成。例如:HDD(Hard Disk Drive)和 HDC(Hard Disk Controller)。

Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller_数据


  • 设备控制器与 CPU 的接口​:该接口用于实现 CPU 与设备控制器之间的通信。共有三类信号线: 数据线、地址线和控制线。数据线通常与 ​数据寄存器​ 和 ​控制/状态寄存器​ 相连接。在设备控制器中有若干个此类寄存器,前者用于存放从 CPU 或外部设备送来的数据;后者用于存放从 CPU 送来的控制指令或从外部设备送来的设备的状态信息。
  • 设备控制器与外部设备的接口​:同一个设备控制器,可以连接一个或多个外部设备。相应地,在设备控制器中便有一个或多个接口,一个接口连接一台外部设备。在每个接口中都存在数据、控制和状态三种类型的信号。设备控制器中的 I/O 逻辑根据处理机发来的地址信号去选择一个设备接口。
  • I/O 逻辑​:在设备控制器中的 I/O 逻辑用于实现对外部设备的控制。它通过一组控制线与处理机交互,处理机利用 I/O 逻辑向设备控制器发送 I/O 命令;I/O 逻辑对收到的命令进行译码。每当 CPU 要启动一个设备时,一方面将启动命令发送给设备控制器;另一方面又同时通过地址线把设备地址发送给设备控制器,由控制器的 I/O 逻辑对收到的地址进行译码,再根据所译出的命令对所选外部设备进行控制。

外设的编址方式

处理机要对外设进行选择和交互,首先就要对外设进行编址。设备控制器是一个可编址的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;若控制可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个硬件设备。由此必须为每台计算机都规定一些专用于外设的地址码,称为设备代码。

根据 CPU 向外设下达指令的方式的不同,对应有两种寻址方式​:


  1. CPU 提供专设的 I/O 指令,这些 I/O 指令的地址码字段直接就给出了外设的设备代码。
  2. 利用访存(取数/存数)指令来完成 I/O 功能。从主存的地址空间中分出了一部分地址码作为外设的设备代码,这些地址码指向了设备相应的数据缓冲寄存器或设备状态寄存器。IBM PC 系列计算机的 CPU 就设置了专门的 I/O 指令,外设的编址可达 512 个,每一台外设占用了若干个地址码,分别于用于表示设备适配器中各个寄存器的地址,各个寄存器的地址码具有唯一性。

外设数据传输控制方式

这里的数据传输控制方式指的是外部设备与 CPU 之间的数据传输。

程序直接控制方式

程序直接控制数据传输方式​:由用户程序实现一段由输入输出指令和其他指令所组成的程序段直接控制外部设备的工作。

数据传送时,首先由 CPU 发出设备启动指令来启动设备,然后 CPU 等待外部设备完成接收或发送数据的准备工作。在等待期间,CPU 不断的用一条测试指令检测外部设备的工作状态标志触发器,以此来确定外部设备的状态。一旦标志触发器被置成 “完成” 状态,那么即表示可以进行数据传输。

这种数据传输方式虽然简单,但 CPU 和外部设备只能串行工作,造成了 CPU 的空浪费,使得系统效率大大的降低了。

程序中断控制方式

程序中断控制数据传输(Program Interrupt Transfer)方式​:在程序中安排一条指令,发出信号启动外部设备,然后机器会继续执行原程序。当外部设备完成了数据传输的准备工作后,便会向 CPU 发送 “中断请求”(INT)信号。此时,CPU 停止正在运行的程序,向执行 “中断服务程序”,完成传送数据的工作。通常是一个字或字节的传输,传送完毕之后再返回继续执行原程序。

这种数据传输的方式不会造成 CPU 的空,在一定的程序上实现了 CPU 和外部设备的并行工作。此外,还可以支持多台外部设备的并行工作。如果有多台外部设备依次启动之后,它们可以同时进行数据交换的准备工作。若在某个时刻,有若干台外部设备同时发出中断请求信息到 CPU,那么 CPU 可以根据预先规定好的优先级策略来依次处理这几台外部设备的数据传输,从而实现了外部设备的并行工作。

但是,对于一些数据传输频率较高的外部设备而言,采用程序中断控制方式容易造成数据丢失。例如:磁盘设备、高速网络设备。因为此类外部设备传输的数据是成批量的,而且单位数据之间的时间间隔较短。

所以,对于面向数据块(成组数据)传输的外部设备,应该采用直接存储器存取(DMA)控制方式。在 DMA 技术出现之前,应用程序与外设之间的 I/O 操作都是通过 CPU 的中断完成的。

每次用户进程读取磁盘数据时,都需要 CPU 中断,然后发起 I/O 请求等待数据读取和拷贝完成,每次的 I/O 中断都导致 CPU 的上下文切换:


  1. 用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。
  2. CPU 在接收到指令以后对外设发起 I/O 请求,将磁盘数据先放入设备控制器缓冲区。
  3. 数据准备完成以后,外设向 CPU 发起 I/O 中断。
  4. CPU 收到 I/O 中断以后将设备控制器缓冲区中的数据拷贝到内核缓冲区,然后再从内核缓冲区拷贝到用户缓冲区。
  5. 用户进程由内核态切换回用户态,解除阻塞状态,然后等待 CPU 的下一个执行时间钟。

Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller_寄存器_02

DMA(直接存储器存取)控制方式

在程序中断控制方式的基础上,引入了 DMA 控制方式,由 DMA 控制器来负责数据的传输,降低了 I/O 中断操作对 CPU 资源的大量消耗。

DMA(Direct Memory Access,直接存储器存取)方式的基本思想是在外设和主存储器之间开辟直接的数据传输通路。DMA 是一种硬件机制,它允许外设和主存之间直接传输它们的 I/O 数据,而几乎不需要 CPU 的参与。目前大多数的硬件设备,包括:网卡、磁盘、显卡、声卡等都支持 DMA 技术。

DMA 控制方式下,只有当外设完成了输入/输出数据的准备工作之后,会占用 CPU 总线的一个工作周期,和主存直接交换数据。这个周期之后,CPU 又继续控制总线执行原程序。可见,CPU 除了在数据传输开始和结束时做一点处理外(开始和结束时候要做中断处理),在传输过程中 CPU 可以继续进行其他的工作。这样在大部分时间里,CPU 计算和 I/O 操作都处于并行操作,使整个计算机系统的效率大大提高。

有了 DMA 磁盘控制器接管数据读写请求以后,CPU 从繁重的 I/O 操作中解脱,数据读取操作的流程如下:


  1. 用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。
  2. CPU 在接收到指令以后对 DMA 磁盘控制器发起调度指令。
  3. DMA 磁盘控制器对磁盘发起 I/O 请求,将磁盘数据先放入磁盘控制器缓冲区,CPU 全程不参与此过程。
  4. 数据读取完成后,DMA 磁盘控制器会接受到磁盘的通知,将数据从磁盘控制器缓冲区拷贝到内核缓冲区。
  5. DMA 磁盘控制器向 CPU 发出数据读完的信号,由 CPU 负责将数据从内核缓冲区拷贝到用户缓冲区。
  6. 用户进程由内核态切换回用户态,解除阻塞状态,然后等待 CPU 的下一个执行时间钟。

Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller_数据传输_03

DMA 方式的不足之处在于对外部设备的管理和某些操作的控制仍需要 CPU 来承担。

DMA 控制器的功能​:


  • 能向 CPU 发出系统保持(HOLD)信号,提出总线接管请求。
  • 当 CPU 发出允许接管信号后,负责对总线的控制,进入 DMA 方式。
  • 能对存储器寻址及能修改地址指针,实现对内存的读写操作。
  • 能决定本次 DMA 传送的字节数,判断 DMA 传送是否结束。
  • 发出 DMA 结束信号,使 CPU 恢复正常工作状态。

DMA 信号​:


  • DREQ:DMA 请求信号。是外设向 DMA 控制器提出要求,DMA 操作的申请信号。
  • DACK:DMA 响应信号。是 DMA 控制器向提出 DMA 请求的外设表示已收到请求和正进行处理的信号。
  • HRQ:DMA 控制器向 CPU 发出的信号,要求接管总线的请求信号。
  • HLDA:CPU 向 DMA 控制器发出的信号,允许接管总线的应答信号。

Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller_数据_04

I/O 通道控制方式

在大型计算机系统中通常会设置专门的硬件设备来完成处理机与外部设备之间的数据传输控制,这就是 I/O 通道控制(I/O channel control)方式​。I/O 通道是专门的设备,可以独立的执行使用通道命令编写的输入输出控制程序,产生相应的控制信号发送大由它管辖的外部设备,继而完成复杂的输入输出过程,有效的减轻了 CPU 的负担。

I/O 通道控制方式的不足之处在于,其仅仅是面向外部设备的控制和数据传输,对一些操作仍然需要 CPU 来完成,例如:码制换、格式处理、数据块错误检测和纠错。因此,I/O 通道的诞生仅代表着计算机组织形式向功能分散发展的初始阶段。

外围处理机控制方式

外围处理机(Peripheral Processor Unit,PPU),又称输入输出处理机。顾名思义,是一个完全独立的处理机,其结构更加接近于计算机。有了外围处理机不但可以简化设备控制器,而且还可以使用外围处理机来作为维护、诊断、通信控制、系统工作情况显示和人机联系的工作,是彻底释放处理机工作负担的数据传输控制设备。在某些大型计算机系统中,设置多台外围处理机使得计算机系统结构有了质的飞跃。外围处理机标志着计算机由集中式向功能发散的分布式系统发展。