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