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

时间:2018-09-23 17:39:33

标签: linux-kernel kernel linux-device-driver

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

1 个答案:

答案 0 :(得分:0)

您可以通过CS寄存器的值确定cpu是处于用户模式还是内核模式,除了RIP,RSP,SS等之外,CS寄存器还通过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   $3, CS-RIP+8(%rsp)
jz  .Lnmi_from_kernel