Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
Linux内核中调用给定函数的上下文是什么_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

Linux内核中调用给定函数的上下文是什么

Linux内核中调用给定函数的上下文是什么,linux,linux-kernel,linux-device-driver,Linux,Linux Kernel,Linux Device Driver,是否有一种直接的机制来确定给定函数是在中断上下文中调用还是从进程上下文中调用。这是问题的第一部分。第二部分是:如何同步两个进程,一个在中断上下文中,另一个在进程上下文中。如果我的理解是正确的,我们不能在中断上下文中为进程使用互斥体,因为它不允许休眠。另一方面,如果我使用自旋锁,另一个进程将使用CPU周期。同步这两个进程的最佳方式是什么。如果我的理解完全错误,请纠正我。您可以判断函数是否作为IRQ处理程序使用函数运行。但我认为使用它不是一个好的做法。您应该只从代码中看到函数正在哪个上下文中运行。否

是否有一种直接的机制来确定给定函数是在中断上下文中调用还是从进程上下文中调用。这是问题的第一部分。第二部分是:如何同步两个进程,一个在中断上下文中,另一个在进程上下文中。如果我的理解是正确的,我们不能在中断上下文中为进程使用互斥体,因为它不允许休眠。另一方面,如果我使用自旋锁,另一个进程将使用CPU周期。同步这两个进程的最佳方式是什么。如果我的理解完全错误,请纠正我。

您可以判断函数是否作为IRQ处理程序使用函数运行。但我认为使用它不是一个好的做法。您应该只从代码中看到函数正在哪个上下文中运行。否则我会说你的代码设计不好


至于同步机制——你是对的,你必须使用自旋锁,因为你需要在原子上下文中进行同步(例如中断)——这并不是说你有很多选择。在等待spinlock时,会浪费大量CPU周期,这一点也是对的,因此您应该尽量减少锁定下的代码量。

补充Sam的答案-您应该设计具有下半部分和上半部分的中断处理程序。这使您在中断处理程序中有一个最小的代码(上半部分)(在驱动程序中请求irq时注册),其余部分(下半部分)可以使用工作队列进行调度。 您可以在spinlock保护的原子上下文中使用这个上半部分(您只需处理中断并从设备执行一些最小的red/写入操作),这样就可以减少等待spinlock时浪费的CPU周期数