检测 NMI 处理程序中的最后操作模式

Detecting last mode of operation in an NMI handler

我正在 LKM 中编写 NMI 处理程序。我想知道 NMI 火灾期间的操作模式(用户或内核)。是否有任何内核标志来表示?我是 运行 Linux 4.18.0.

你可以通过CS寄存器的值来判断cpu是在用户模式还是内核模式,除了RIP,RSP,SS等CPU保存在堆栈上

Intel® 64 and IA-32 ArchitecturesSoftware Developer’s ManualVolume 3A:System Programming Guide, Part 第 6.12.1 节

描述了中断的堆栈布局

在内核模式下,保存的CS值为__KERNEL_CS,在用户模式下- __USER_CS.

默认内核 nmi 处理程序的代码实际上在 /arch/x86/entry/entry_64.S:

中执行此操作
ENTRY(nmi)
...
testb   , CS-RIP+8(%rsp)
jz  .Lnmi_from_kernel