linux-kernel - in_irq() 可靠吗?

标签 linux-kernel x86 kernel irq

Unreliable Guide To Hacking The Linux Kernel指出

You can tell you are in a hardware interrupt, because in_irq() returns true.
Caution. Beware that this will return a false positive if interrupts are disabled (see below).


in_irq()真的是这样吗?在 x86 上的 Linux 内核 2.6.32 或更新版本中,是否可以在非硬中断上下文中返回非零值?

在我对内核 2.6.32 (Debian 6) 和 3.4 (OpenSUSE 12.1) 的实验中,in_irq()从进程上下文调用时总是返回 0,即使它是在 local_irq_disable() 之间调用的和 local_irq_enable() .当我使用禁用中断的自旋锁函数而不是 local_irq* 时,结果是一样的。 .

从内核的源代码,我目前看不到如何in_irq()可以返回误报。有人可以澄清这一点吗?

编辑:我也试过 *_irqsave()*_irq()自旋锁 API 以及 local_irq_save()/local_irq_restore() ,结果都是一样的,即in_irq()当中断被禁用时返回 0。通过 cli 显式禁用中断x86 上的机器指令也没有强制 in_irq() 返回非零值。

最佳答案

in_irq()looks at some bits in preempt_count 的包装器,这是 thread_info 中的 int struct 并且值为 0 意味着它没有被抢占,所以它不在 irq 中。
local_irq_disable()本身不影响该计数,但 spin_lock_irqsave() does ,因此可能会导致误报。你说你用过自旋锁功能,你用过这个吗?如果是,请查看 preempt_count 的值是否正在更改。

编辑:只是为了涵盖所有基础,请检查以确保启用内核抢占。

关于linux-kernel - in_irq() 可靠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14682183/

相关文章:

caching - 缓存行刷新是否访问 TLB?

linux - android linux内核中的虚拟地址到物理地址和反向

android - 物理地址、设备地址和虚拟地址的区别

c - 如何使用内核头文件<linux/gfp.h>

linux - 来自 initramfs 的文件 "disappearing"

linux - 在适用于 Linux 的 Windows 子系统上的 Ubuntu 上使用 INT 0x80 汇编编译的可执行文件不产生输出

assembly - 通过 8042 PS/2 Controller 重置后,QEMU 不会重启我的操作系统

c - 信号处理 - 异步函数和多线程应用程序,信号堆栈

linux-kernel - 如何随linux内核启动输出pr_info()信息

linux - 配置 ARP 年龄超时