【问题标题】:timer signal the process that adds it and wakes it up from interruptable sleep计时器向添加它的进程发出信号并将其从可中断睡眠中唤醒
【发布时间】:2018-06-04 20:10:09
【问题描述】:

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

wait_event_interruptible();

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

wait_event();

那么问题就解决了。我读到了 wake_up_event_interruptible() 如果中断唤醒进程,则返回非零返回码。

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

【问题讨论】:

    标签: linux linux-kernel linux-device-driver


    【解决方案1】:

    来自code for wait_event_interruptible:当当前内核进程的信号未决时,函数wake_up_event_interruptible() 返回-ERESTARTSYS(即-512)。

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

    【讨论】:

    • 所以这意味着我的驱动程序进程(设置中断的进程)被中断,因为我的系统不忙并且驱动程序主要作为当前进程运行,并且计时器在到期时产生中断,我当前的进程 [在这种情况下是我的驱动程序] 被中断了?如果我希望我当前的代码能够工作,那么如果 return 不是 0 使用 while 或其他东西,除了再次等待之外还有其他方法吗?我的意思是有更整洁的方法吗?
    • 不是驱动进程被中断,而是CPU被中断。您的驱动程序进程可能会被中断,也可能不会。在具有 2 个 CPU 的机器上,您的驱动程序进程和定时器中断处理程序可以同时同时运行,即使速度不同。在设计驱动程序时,您需要考虑到这一点。如果您的中断处理程序使用在您的其他例程中使用的共享资源,您需要实现信号量/互斥体,以免出现竞争条件。
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2013-04-22
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多