外设与总线
外设与总线(Peripherals and buses)
外设(Peripherals)是连接到计算机的许多外部设备中的任何一个。显然,处理器必须通过某种方式与外围设备对话,以使其变得有用。处理器与外围设备之间的通信通道称为总线。设备需要输入和输出才有用,与外设进行有效通信需要许多通用概念。
中断(Interrupts)
中断允许设备从字面上中断处理器以标记某些信息。例如,当按键被按下时,将产生中断,以将按键事件传递给操作系统。通过操作系统和 BIOS 的某种组合为每个设备分配了一个中断。设备通常连接到可编程中断控制器(PIC),可编程中断控制器是主板的一部分,用于缓冲中断信息并将其传达给主处理器。每个设备之间都有一条物理中断线,该中断线是系统提供的 PIC 之一。当设备想要中断时,它将修改该线上的电压。
PIC 角色的一个非常广泛的描述是它接收到该中断并将其转换为一条消息,供主处理器使用。尽管具体过程随体系结构而变化,但一般原则是操作系统已配置了一个中断描述符表,该表将每个可能的中断与代码地址配对,以在接收到中断时跳转到该地址。编写此中断处理程序是设备驱动程序作者与操作系统结合的工作,设备将中断引发给中断控制器,后者将信息传递到处理器;处理器查看由操作系统填写的描述符表,以找到处理故障的代码。
大多数驱动程序会将中断的处理分为下半部分和上半部分。下半部分将确认中断,将处理操作排队,并使处理器返回到其正在快速执行的操作。然后,当 CPU 空闲时,上半部分将稍后运行,并进行更密集的处理。这是为了停止占用整个 CPU 的中断。
保存状态
由于中断随时可能发生,因此在完成中断处理后,您必须返回正在运行的操作,这一点很重要。确保进入中断处理程序后,它保存任何状态通常是操作系统的工作。即寄存器,并从中断处理程序返回时将其恢复。这样,除了浪费一些时间外,中断对于当时正在运行的任何事物都是完全透明的。
Interrupts vs traps and exceptions
虽然中断通常与物理设备的外部事件相关联,但相同的机制对于处理内部系统操作很有用。例如,如果处理器检测到条件,例如对无效内存的访问,除以零的尝试或无效指令,则它可以在内部引发要由操作系统处理的异常。它也是用于捕获操作系统中用于系统调用的机制以及实现虚拟内存的机制。尽管内部生成而不是外部生成,但是异步中断正在运行的代码的原理仍然相同。
中断的类型
在线路上发出中断信号的主要方式有两种:电平触发和边沿触发。电平触发的中断定义了中断线的电压保持高电平,以指示中断待处理。边沿触发的中断检测总线上的转换;即线电压从低变高。对于边沿触发的中断,PIC 会检测到方波脉冲作为信号并发出中断。当设备共享中断线时,差异显着。在电平触发的系统中,中断线将为高电平,直到处理了引发中断的所有设备并取消声明其中断为止。在边沿触发系统中,线路上的脉冲将向 PIC 指示已发生中断,并将其发信号通知操作系统进行处理。但是,如果另外的脉冲从另一个设备进入已经确定的线路。
电平触发的中断的问题在于,可能需要花费大量时间来处理设备的中断。在这段时间内,中断线保持高电平,无法确定是否有其他设备在该线上引发了中断。这意味着在服务中断时可能会有相当长的不可预测的延迟。使用边沿触发的中断,可以注意到长时间运行的中断并在其中排队,但是在发生这种情况时,共享该线路的其他设备仍可以转换(并因此引发中断)。但是,这带来了新的问题。如果两个设备同时中断,则可能会错过其中一个中断,或者环境或其他干扰可能会产生虚假中断,应将其忽略。
不可屏蔽的中断
对于系统而言,一定时间掩盖或防止中断很重要。通常,可以将中断置于保留状态,但是特定类别的中断(称为不可屏蔽中断(NMI))是该规则的例外。典型示例是复位中断。NMI 对于实现诸如系统监视程序之类的事情很有用,在该系统中,NMI 会定期提高并设置一些必须由操作系统确认的标志。如果在下一个定期 NMI 之前未看到该确认,则可以认为系统没有取得进展。另一个常见用法是对系统进行概要分析。可以提出定期的 NMI 并将其用于评估处理器当前正在运行的代码。随着时间的流逝,这将建立一个正在运行的代码的配置文件,并对系统性能产生非常有用的洞察力。
IO Space 与 DMA
显然,处理器将需要与外围设备进行通信,并通过 IO 操作进行通信。IO 的最常见形式是所谓的内存映射 IO,其中设备上的寄存器映射到内存中。这意味着要与设备通信,您只需简单地读取或写入内存中的特定地址即可,这也就是 IO Space 的概念。
由于设备的速度远远低于处理器的速度,因此需要采取某种方法来避免 CPU 等待来自设备的数据。直接内存访问(DMA)是一种在外围设备和系统 RAM 之间直接传输数据的方法。驱动程序可以通过为设备设置 RAM 区域以放置其数据来进行 DMA 传输。然后,它可以开始 DMA 传输,并允许 CPU 继续执行其他任务。一旦设备完成,它将引发一个中断并向驱动程序发送信号,表明传输已完成。从那时起,设备中的数据(例如磁盘中的文件或视频捕获卡中的帧)就已存储在内存中,可以使用了。
其他总线
其他总线连接在 PCI 总线和外部设备之间。从操作系统的角度来看,USB 设备是一组端点,这些端点组合在一起成为一个接口端点可以是入站或出站,因此只能在一个方向上传输数据端点可以具有许多不同的类型:
-
控制端点用于配置设备等。
-
中断端点用于传输少量数据,他们比其他的端点具有更高的优先级。
-
批量端点,这些端点传输大量数据,但没有保证的时间限制。
-
同步传输是高优先级的实时传输,但是如果错过它们,则不会重试这用于流式传输视频或音频之类的数据,而毫无意义地再次发送数据。
可以有许多接口(由多个端点组成),并且接口被分组为配置但是,大多数设备只有一个配置。
上图显示了通用主机控制器接口或 UHCI 的概述。它概述了如何通过硬件和软件的组合将 USB 数据移出系统。本质上,该软件以指定的格式设置数据模板,以供主机控制器读取和通过 USB 总线发送。从概述的左上角开始,控制器具有一个帧寄存器,该寄存器带有一个计数器,该计数器周期性地(每毫秒)递增。该值用于索引由软件创建的框架列表。该表中的每个条目都指向传输描述符队列。软件会将该数据设置在内存中,然后由驱动 USB 总线的独立芯片即主机控制器读取。软件需要安排工作队列,以便将 90%的帧时间分配给同步数据,剩下 10%的时间用于中断,控制和批量数据。
从图中可以看出,数据的链接方式意味着等时数据的传输描述符仅与一个特定的帧指针关联(换句话说,仅与一个特定的时间段关联),之后将被丢弃。但是,中断,控制和批量数据都在同步数据之后排队,因此,如果不在一个帧(时间段)内发送,则将在下一帧进行。USB 层通过 USB 请求块或 URB 进行通信 URB 包含有关此请求与哪个端点有关的信息,数据,任何相关信息或属性以及当 URB 完成时要调用的回调函数 USB 驱动程序将固定格式的 URB 提交给 USB 内核,后者与上述 USB 主机控制器协同管理它们 USB 内核会将您的数据发送到 USB 设备,并在完成后触发您的回叫。