微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从内核调用local_irq_disable还会在用户空间中禁用本地中断吗?

如何解决从内核调用local_irq_disable还会在用户空间中禁用本地中断吗?

我可以从内核调用local_irq_disable()。据我了解,它将禁用当前cpu的中断。并且中断将保持禁用状态,直到我调用local_irq_enable()。如果我的理解不正确,请纠正我。

如果我的理解是正确的,这是否意味着在调用local_irq_disable()的同时,对于在同一cpu上运行的用户空间中的进程也禁用了中断?

更多详细信息:

我有一个要在用户空间中运行的进程,该进程要不受中断和上下文切换的影响而运行。由于无法从用户空间进行操作,因此我认为从内核中为特定cpu禁用中断和内核抢占会有所帮助。因此,我编写了一个简单的设备驱动程序,以使用以下代码来禁用内核抢占和本地中断

    int i = irqs_disabled();
    pr_info("before interrupt disable: %d\n",i);
    pr_info("module is loaded on processor: %d\n",smp_processor_id());
    id = get_cpu();
    
    message[1] = smp_processor_id() + '0';
    
    local_irq_disable(); 
    
    printk(KERN_INFO " Current cpu id is %c\n",message[1]);
    printk(KERN_INFO " local_irq_disable() called,disable local interrupts\n");
    pr_info("After interrupt disable: %d\n",irqs_disabled());

输出:$ dmesg

[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

我认为输出确认local_irq_disable()确实禁用了本地中断。

在禁用内核抢占和中断之后,在用户空间中,我使用cpu_SET()将进程固定到该特定cpu。但是在完成所有这些操作之后,我仍然没有得到理想的结果。因此,从内核禁用特定cpu的中断似乎也禁用了在该cpu上运行的用户空间进程的中断。我很困惑。

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

解决方法

具有禁用中断的CPU状态的

持续时间应该为 short ,因为它会影响整个操作系统。因此,允许用户空间代码在禁用的中断下运行被认为是坏习惯,并且Linux内核不支持。

内核模块负责local_irq_disable / local_irq_enable仅包装内核代码。有时内核本身可以“修复”这些功能的不正确使用,但是在编写模块时不应依赖这一事实。

我有一个要在用户空间中运行的进程,该进程要在不受中断和上下文切换影响的情况下运行。

通过适当设置调度策略,亲和力和进程的优先级,可以实现对上下文交换机的保护。这样,调度程序将永远不会尝试重新调度您的进程。关于堆栈溢出,有几个问题涉及使CPU不受所选进程的影响。

至于中断,不应禁用用户代码。

如果用户代码访问某些应禁用中断的硬件,则考虑将代码移入内核空间。

如果即使极少的中断也会严重影响您的进程的性能或其定时,请尝试将Linux内核重新配置为“更实时”。还有一些启动时配置选项,可以帮助进一步减少特定内核上的中断数量。参见例如这个问题:Why does using taskset to run a multi-threaded Linux program on a set of isolated cores cause all threads to run on one core?

请注意,Linux内核不是实时OS的基础,也从未希望如此。因此,如果没有任何配置和启动设置可以帮助您,请考虑为您的应用选择另一个实时操作系统。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。