Linux kernel 从内核调用local_irq_disable()也会禁用用户空间中的本地中断吗?

Linux kernel 从内核调用local_irq_disable()也会禁用用户空间中的本地中断吗?,linux-kernel,x86-64,linux-device-driver,interrupt,Linux Kernel,X86 64,Linux Device Driver,Interrupt,从内核我可以调用local\u irq\u disable()。据我所知,它将禁用当前CPU的中断。中断将保持禁用状态,直到我调用local\u irq\u enable()。如果我的理解不正确,请纠正我 如果我的理解是正确的,这是否意味着在调用local\u irq\u disable()时,用户空间中运行在同一CPU上的进程的中断也被禁用 更多详细信息: 我有一个在用户空间中运行的进程,我希望它不受中断和上下文切换的影响。由于这在用户空间是不可能的,所以我认为在这种情况下,从内核中禁用特定C

从内核我可以调用
local\u irq\u disable()
。据我所知,它将禁用当前CPU的中断。中断将保持禁用状态,直到我调用
local\u irq\u enable()
。如果我的理解不正确,请纠正我

如果我的理解是正确的,这是否意味着在调用
local\u irq\u disable()
时,用户空间中运行在同一CPU上的进程的中断也被禁用

更多详细信息:

我有一个在用户空间中运行的进程,我希望它不受中断和上下文切换的影响。由于这在用户空间是不可能的,所以我认为在这种情况下,从内核中禁用特定CPU的中断和内核抢占将有所帮助。因此,我编写了一个简单的设备驱动程序,使用以下代码禁用内核抢占和本地中断

int i=irqs_disabled();
pr_info(“中断前禁用:%d\n”,i);
pr_info(“模块加载到处理器:%d\n”,smp_处理器_id());
id=get_cpu();
消息[1]=smp_处理器_id()+“0”;
本地_irq_disable();
printk(KERN_INFO“当前CPU id为%c\n”,消息[1]);
printk(调用KERN_INFO“local_irq_disable(),禁用本地中断\n”);
pr_info(“中断后禁用:%d\n”,irqs_禁用());
输出:$dmesg

我认为输出确认了
local\u irq\u disable()
确实禁用了本地中断

禁用内核抢占和中断后,在用户空间中,我使用
CPU\u SET()
将进程固定到特定的CPU中。但在做了所有这些之后,我仍然没有得到想要的结果。所以,似乎从内核禁用特定CPU的中断也会禁用在该CPU上运行的用户空间进程的中断是不正确的。我很困惑


我正在寻找上述问题的答案,但没有找到任何合适的答案。

中断被禁用的CPU状态的持续时间应短,因为它会影响整个操作系统。因此,允许用户空间代码在禁用中断的情况下运行被认为是不良做法,Linux内核不支持这种做法

内核模块负责通过
local\u irq\u disable
/
local\u irq\u enable
仅对内核代码进行包装。有时内核本身可以“修复”这些函数的错误用法,但在编写模块时不应依赖这一事实

我有一个在用户空间中运行的进程,我希望它不受中断和上下文切换的影响

通过适当设置进程的调度策略、关联性和优先级,可以实现对上下文切换的保护。这样,调度器将永远不会尝试重新安排您的进程。关于使CPU成为所选进程的专用CPU,在堆栈溢出方面有几个问题

至于中断,它们不应该被用户代码禁用

如果用户代码访问一些应该中断的硬件,那么考虑将代码移动到内核空间。

如果即使是罕见的中断也会严重影响进程的性能或时间,那么请尝试将Linux内核重新配置为“更实时”。还有一些启动时配置选项,这有助于进一步减少特定内核上的中断次数。例如,见问题:


请注意,Linux内核不是实时操作系统的基础,也从来没有打算这样做。所以,如果没有配置和启动设置可以帮助你,考虑为你的应用程序选择另一个OS,这是实时的。

如果你被中断的用户空间返回,那么内核将如何恢复控制?使用性能计数器事件从NMI看门狗?(NMI不会被清除IF阻止)。或者你会依赖用户空间来最终进行系统调用吗?但无论如何,用户空间的RFLAG是单独保存的,恢复它将重新启用中断,而不管内核的RFLAG是否已清除。因此,如果处于任务状态的已保存RFLAGS中,您可能可以删除任何检查
ptrace
以阻止用户空间清除。@PeterCordes我的设备驱动程序有另一个段通过调用local\u irq\u enable()&put\u cpu()来恢复中断,因此您确实依赖于用户空间进行另一次系统调用(到您的驱动程序中)正如我推测的那样,运行内核代码。好的,这是有道理的。在进入用户空间时,会启用中断。例如,请参见“kernel/entry/common.c”(在禁用中断的情况下调用)中的
exit_to_user_mode()
注释:Syscall/interrupt exit启用中断,但是当调用时,内核状态是中断禁用的。值得一提的是,作为内核命令行选项的
isolcpus=2
将使内核真正独立于CPU内核(
#2
),甚至可能不配置它来处理任何外部中断。使用正确的无滴答的内核配置,我认为您还可以避免计时器中断@彼得·科德斯:谢谢你的评论,我已经把它的第一个链接添加到了回复帖中。至于避免计时器中断,据我所知,这仍然不是“避免所有中断”:为了保持RCU宽限期,Linux内核仍然需要在每个CPU内核上定期引发中断。不确定RT配置/补丁是否会使此需求变得不必要。
[22690.997561] before interrupt disable: 0
[22690.997564]  Current CPU id is 1
[22690.997565]  local_irq_disable() called, Disable local interrupts
[22690.997566] After interrupt disable: 1