Linux 运行时中断:概念与实现(linux中断是什么)
Linux 操作系统中的运行时中断是一种异步的执行状态,它用于处理系统中的异步事件,如时钟中断和 I/O中断等。CPU 会立即停止当前的处理,并将控制权转移到内核或硬件,以便处理来自设备的中断。本文将讨论Linux下运行时中断的概念,原理及其实现方式。
由于 Linux 操作系统是面向用户的多任务操作系统,因此它必须能够同时处理来自硬件设备和用户程序的中断。每个中断都有一个中断号,内核搜索中断处理程序来处理它。中断处理程序只有一个少量的代码,它以中断号来驱动的。
Linux 运行时中断和其他硬件中断最大的不同之处在于,它们由软件来调用并处理,而不像硬件中断一样由硬件调用处理。因此,内核中的每个运行时中断都有一个具体的中断处理函数(handler routine)。当内核需要调用此类中断时,它会调用其中断处理程序,而不是外部中断程序。
Linux 中断处理程序函数也称为“中断函数”(interrupt service routines,ISRs),它们能够接收特定硬件中断,并且能够接受 CPU 上的非抢占式处理。从 Linux 2.6 内核开始,Linux 系统中的 ISR 函数被称为“tasklets”,是一种新的低开销的运行时中断,可以被添加或移除,它们可以被用于轻量级的中断处理,而不立即调用 ISR,而是在控制流程回到进程上下文时被处理。
使用`tasklet_init()、tasklet_schedule()`等函数即可对特定的运行时中断进行不同程度的初始化、调度、暂停和恢复。`tasklets`是一种内核代码,具体实现如下:
struct tasklet_struct {
struct tasklet_struct *next; unsigned long state;
atomic_t count; //引用计数 void (*func)(unsigned long); //回调函数
unsigned long data; //参数 };
static void tasklet_action(struct softirq_action* a){
struct tasklet *list; unsigned long flags;
local_irq_save(flags); list = __get_cpu_var(tasklet_vec).head;
__get_cpu_var(tasklet_vec).head = NULL; __get_cpu_var(tasklet_vec).tail = &__get_cpu_var(tasklet_vec).head;
local_irq_restore(flags);
while (list) { struct tasklet *t = list;
list = list->next; if (tasklet_trylock(t)) {
if (!atomic_read(&t->count)) { if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
BUG(); t->func(t->data);
tasklet_unlock(t); continue;
} tasklet_unlock(t);
}
local_irq_save(flags); t->next = NULL;
*__get_cpu_var(tasklet_vec).tail = t; __get_cpu_var(tasklet_vec).tail = &(t->next);
__raise_softirq_irqoff(TASKLET_SOFTIRQ); local_irq_restore(flags);
}}
总之,Linux 运行时中断是 Linux 操作系统中重要的一部分,它提供了一种方法来解决硬件设备的中断,并帮助提高系统性能。它可以实现低开销的中断处理,并能灵活高效地处理由硬件和用户应用程序引发的多种中断。