在 Linux 系统中,中断是一种处理硬件事件的机制,用于响应硬件事件并在必要时进行处理。它使得 Linux 操作系统能够通过与各种硬件设备的交互来实现完成各种任务的功能。Linux 中断由硬件触发,并与操作系统内核交互,它负责管理和调度 CPU 对各种硬件请求的响应。
在 Linux 中,中断请求(IRQ)指的是来自硬件设备的信息信号,这些信号被发送到 CPU 进行操作处理。不同类型的硬件设备可能会触发不同类型的中断请求,这要求内核为每种中断类型分配一个唯一的编号,该编号也称为“中断号”。
在 Linux 中,可以使用 /proc/interrupts 文件查找系统中所有可用的中断信息。每行表示一个中断向量,并显示有关中断的信息。此外,可以使用/proc/sys/kernel/nmi_watchdog 文件来控制 NMI(非屏蔽中断)的行为,该文件的值为 0 表示禁用 NMI,否则表示启用。
要获取某个具体硬件设备的中断号,可以使用 lspci 或 lsusb 命令查看系统当前存在哪些硬件设备,然后再通过 /proc/interrupts 文件来获取具体硬件设备所关联的中断号信息。
在 Linux 中,共有 256 种中断类型,其中部分类型已被预留,因此实际可用的中断类型会少于 256 种。每个中断类型都有一个唯一的中断号,中断号从 0 到 255。在 Linux 内核中,irq_desc_t 数据结构维护了关于中断的大部分信息,包括中断处理程序的地址、中断状态、中断计数器等等。
在不同的系统中,可用的中断号也可能会有不同的范围。例如,在 x86 和 x86_64 架构上,中断号的范围为 0 至 255,而在 ARM 架构上,中断号的范围为 32 至 191,其中 0 至 31 的中断类型是保留的。
在 Linux 内核中,每个中断类型都需要一个中断处理程序来实际处理该类型中断的请求。以下是一些常见的中断处理程序:
1. do_IRQ:这个处理程序负责处理大多数硬件中断,并根据中断号调用正确的设备驱动程序。
2. top-half:这个处理程序处理中断的前半部分,并通常是对数据执行简单的处理。
3. bottom-half:这个处理程序是中断处理的后半部分,在中断上下文环境中使用。
4. tasklets:这是一种在内核 2.6 版本中引入的处理程序模型,用于在底半部中快速执行轻量级任务。