计时器向添加它的进程发出信号并将其从可中断睡眠中唤醒

timer signal the process that adds it and wakes it up from interruptable sleep

我正在学习 Linux 设备驱动程序,尤其是计时器和等待队列。 我希望它们在单个字符驱动程序中一起工作,我可以使用 IO 控制命令让驱动程序进入睡眠状态,同时我继续使用定时器在用户空间中获得 fasync 中断。 我注意到如果我使用

wait_event_interruptible();

然后当计时器到期时,驱动程序退出等待 return 代码 -512,即使条件尚未满足。但是如果我使用

wait_event();

那么问题就解决了。我读到 wake_up_event_interruptible() returns 非零 return 代码如果中断唤醒进程。

我的理解是正确的,定时器会中断添加它的进程(我在文本中找不到任何证据),因为根据我的理解,定时器功能变得独立于添加它的进程的状态。

来自 code for wait_event_interruptible :函数 wake_up_event_interruptible() returns -ERESTARTSYS (即 -512)当当前内核进程的信号挂起时。

内核计时器(添加 setup_timer)中断当前内核进程的执行,与其状态无关。更具体地说,从 here 开始,内核具有三个队列:任务队列、tasklet(从内核 2.3.43 开始)和内核计时器。 (简单来说)当内核计时器到期时,CPU 分支到中断处理例程,该例程保存当前上下文并分支到计时器注册回调函数。处理完中断后,调度器决定哪个任务得到 CPU 到 运行.