【发布时间】:2017-10-08 14:44:04
【问题描述】:
中断处理程序异步发生,因此不能被其他函数调用。那么,为什么 linux 内核中的中断处理程序会返回一个值呢?输入参数是如何传递给它的?
【问题讨论】:
标签: linux linux-kernel
中断处理程序异步发生,因此不能被其他函数调用。那么,为什么 linux 内核中的中断处理程序会返回一个值呢?输入参数是如何传递给它的?
【问题讨论】:
标签: linux linux-kernel
中断处理程序有一个返回值有几个原因。
【讨论】:
IRQ_WAKE_THREAD 也可用于在较新的 Linux 内核上进行延迟处理。即,它表示当前进程可能会被中断以执行中断的慢部分。
中断处理程序不是中断向量。中断向量是触发中断时处理器跳转到的代码。这是一个粗略的简化,但它看起来是这样的:
interrupt_vector {
num = check_interrupt_number()
f = get_interrupt_handler_func(num);
d = get_interrupt_handler_data(num);
/* call interrupt handler */
ret = f(d);
}
所以handler和data一起注册,中断向量代码调用registererd handler,传递注册的数据,并检查返回值。 当然,这里我们只有一个级别的处理程序,但您可以有几个,例如一个处理所有 PCI Irq 的处理程序,依次检查特定 PCI irq 的注册处理程序,并最终调用它传递注册数据等。 .
当然,实际代码往往要复杂得多。你可以试试这个lxr link 来浏览 linux 内核源代码
【讨论】:
中断向量代码与多个附加的中断处理程序(特定于操作系统)到一个中断 - 处理程序可以返回一个值(通常进入像 x86 上的 EAX 这样的寄存器),因此向量代码可以管理一系列处理程序。
【讨论】: