Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在设备驱动程序中调用诸如set_current_state()/wait_event()之类的睡眠函数的效果?_C_Linux Kernel_Kernel_Driver - Fatal编程技术网

在设备驱动程序中调用诸如set_current_state()/wait_event()之类的睡眠函数的效果?

在设备驱动程序中调用诸如set_current_state()/wait_event()之类的睡眠函数的效果?,c,linux-kernel,kernel,driver,C,Linux Kernel,Kernel,Driver,我对内核模块加载到内核后的工作方式有点困惑,主要是因为睡眠函数调用 以字符设备驱动程序为例,我在read()函数中看到了如下代码,该函数使用set\u current\u state() 在写函数或中断处理程序中,它们试图通过将条件设置为true来唤醒read(),如下所示: condition = true; wake_up_process(task); // -> task was stored inside read() function 我的问题是: 设置\u当前\u状态()或等

我对内核模块加载到内核后的工作方式有点困惑,主要是因为睡眠函数调用

以字符设备驱动程序为例,我在read()函数中看到了如下代码,该函数使用
set\u current\u state()

在写函数或中断处理程序中,它们试图通过将条件设置为true来唤醒read(),如下所示:

condition = true;
wake_up_process(task); // -> task was stored inside read() function
我的问题是:

  • 设置\u当前\u状态()
    等待\u事件\u可中断()?是调用系统调用read()的用户空间进程还是为映射用户空间进程而创建的某个内核进程

  • 假设通过在open()函数中设置原子计数,此设备驱动程序访问仅限于一个进程,并且设备驱动程序未启用中断,那么如果read()调用wait_event(),并且没有其他进程可以唤醒它,会发生什么情况?它会永远被卡住吗(因为不可中断)

  • 使用
    set\u current\u state()
    wait\u event()
    API有什么区别?我已经看到不同的代码段相应地使用这些函数。。。是否应该优先考虑另一个?

  • 内核代码在发出系统调用的用户空间线程的“内核端”上下文中执行。每个用户空间线程都有这样的内核空间对应项。从调度程序的角度来看,线程的用户部分和内核部分是相同的实体,因此,当内核线程被调度出去时,用户线程也被调度出去

  • “可中断”和“不可中断”等待在处理信号的方式上有所不同。当进程处于任务可中断状态并收到信号时,系统确保它尽快从schedule()唤醒。在此之后,若signal_pending()返回true,则进程本身必须离开等待循环。在问题文本中的示例代码中,除非“condition”是包含signal_pending()check的表达式,否则这不会正确实现

  • set_current_state()是当前进程状态的setter调用,它只设置一个标志,不做任何其他事情。它只能与对schedule()的正确调用一起使用。 wait_event()是一个实用程序,它实现了等待的所有技术细节。通常,驱动程序使用wait_event*()风格,只有在特殊情况下才需要直接使用set_current_state()和schedule()


  • 请在问题帖中只留下一个问题。有多个不相关的问题会使你的问题帖子过于宽泛。谢谢你的回答。这确实澄清了我的大部分疑虑。
    condition = true;
    wake_up_process(task); // -> task was stored inside read() function