Я пытаюсь, чтобы обработчик недопустимых ловушек кода операции мог распечатать ошибочный код операции. Платформа является машиной x86-64. Я делаю это, переписывая обработчик как
dotraplinkage void do_invalid_op(struct pt_regs *regs, long error_code) {
// print the offending opcode
pr_info("offending opcode is 0x%02X\n", *(uint8_t *)(regs->ip));
// the original routine
do_error_trap(regs, error_code, "invalid opcode", X86_TRAP_UD, SIGILL, ILL_ILLOPN, IP);
}
Однако, когда я выполняю недопустимую инструкцию (созданную вручную недопустимую инструкцию), я получаю ошибку
[ 24.114923] BUG: unable to handle kernel paging request at 0000000000400096
Здесь я Я проверил, что 0x0000000000400096
действительно недопустимая инструкция, поэтому проблем с rip
я не получаю. Это расстраивает меня, потому что я не думаю, что есть переключение контекста, но каким-то образом я не могу получить доступ к памяти пространства пользователя. Я знаю, что get_user
и copy_from_user
могут быть использованы для этого, но они могут спать, поэтому я не могу использовать их внутри обработчика ловушек.
Что-то я делаю не так? Что я должен сделать, чтобы реализовать такое поведение?