Обнаружение последнего режима работы в обработчике NMI - PullRequest
0 голосов
/ 23 сентября 2018

Я пишу обработчик NMI в LKM.Я хотел бы знать режим (пользователь или ядро) работы во время пожара NMI.Есть ли флаг ядра, чтобы обозначить это?Я использую Linux 4.18.0.

1 Ответ

0 голосов
/ 16 августа 2019

Вы можете определить, был ли процессор в пользовательском режиме или режиме ядра, по значению регистра 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
...