Проблема при доступе к памяти пространства пользователя в обработчике прерываний в Linux - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь, чтобы обработчик недопустимых ловушек кода операции мог распечатать ошибочный код операции. Платформа является машиной 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 могут быть использованы для этого, но они могут спать, поэтому я не могу использовать их внутри обработчика ловушек.

Что-то я делаю не так? Что я должен сделать, чтобы реализовать такое поведение?

...