中断如何与 USB 分离器一起工作?

How do interrupts work with usb splitters?

据我了解,每个输入端口(我假设是 USB/SATA/PCIe 等)都有自己的中断线到 CPU,当被调用时,会触发某种相关的处理程序用那条线。

如果我有一个带有 USB 接口的键盘,并且我插入了一个鼠标,那么 CPU 如何区分它们,因为它们来自同一个输入端口?

谢谢!

这不太正确。给定的设备可能有一个或多个与之关联的中断。设备的概念是直接连接到 cpu 的 控制器 ,而不是套接字或端口。在 USB 示例中,您的机器可能具有与端口一样多的 USB 控制器;但更有可能有一个内置的 USB 集线器,它复用一个控制器,并为用户提供多个端口。

中断的目的是告诉 CPU 设备控制器需要一些注意,可用于更多输出或有输入可用。如果太多设备共享一个中断,CPU 必须搜索需要关注的设备。此搜索会增加服务设备的延迟,因此应尽量减少。因此,每个设备控制器的中断数量是优化搜索适当处理程序的函数,与实现设备(或 控制器 驱动程序)的复杂性相比。

在这个级别的设备交互中,键盘和鼠标之间的区别无关紧要——它是一种从控制器生成和接受数据的设备。在 USB 案例中,class 驱动程序位于 controller 驱动程序之上,后者在附加设备。通常,当控制器被重置,或者设备被插入或拔出时,调度员会根据通用协议中的值确定设备的类型,并因此确定适当的 class 驱动程序为其配置。

因此,设备驱动程序的概念通常有多个层次:硬件交互处于较低或控制器级别;与设备语义关联的协议,在上层或 class 级别。

此示意图显示了 CPU 与插入 USB 端口的 USB 设备(例如键盘)之间的硬件连接。

keyboard---+ USB         USB   +---intr signal-----+ CPU
mouse------+ hub +-----+ contr                        |
sdcard-----+             oller +---data/addr bus+-----+---+ RAM

注意许多设备(左)通过端口连接到一个 USB 集线器,然后连接到 USB 控制器。 USB 控制器直接连接到 CPU 中断控制器,并与 CPU 共享一个到 RAM 的连接。 对应的软件原理图为:

Input ======= keyboard class driver ====* USB
              mouse class driver =======* device
filesystem == sdcard class driver ======* driver

左边的输入和文件系统是表示层-类似软件框架,呈现预期的最终用户体验——按下一个键,相应的字母出现在某处;单击文件并打开。

这些级别通过与 class 驱动程序 交互来提供此功能,这些驱动程序将任何底层设备信息转换为表示层可以理解的标准形式。

每个 class 驱动程序 与与物理控制器交互的设备驱动程序对话。在 USB 中,这有两个主要组成部分 - 中断是 USB 控制器要求 CPU 执行 某事 的要求,以及在驱动程序控制下存储在 RAM 中的数据包.

驱动程序解释了足够多的这些数据包,以了解将它们传递给哪个 class 驱动程序。

问题: 1) 我的意思是 设备控制器 .

2) 调度程序通常是内核的一部分,它与中断控制器硬件协同工作以快速解决中断原因。 CPU 架构定义了中断如何改变 CPU 中的执行流程。如果多个 设备控制器 共享一个中断,中断处理程序需要确定哪个控制器触发了中断。值得庆幸的是,有硬件可以帮助解决这个问题。

3) 见上图。