Я пишу обработчик NMI в LKM.Я хотел бы знать режим (пользователь или ядро) работы во время пожара NMI.Есть ли флаг ядра, чтобы обозначить это?Я использую Linux 4.18.0.
Вы можете определить, был ли процессор в пользовательском режиме или режиме ядра, по значению регистра CS, который сохраняется в стеке процессором в дополнение к RIP, RSP, SS и т. Д.
Схема расположения прерываний в стеке описана в Intel® 64 и IA-32 ArchitecturesSoftware. Руководство разработчика. Том 3A: Руководство по системному программированию, часть Раздел 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