#linux #segmentation-fault #kernel #mmu
#linux #ошибка сегментации #ядро #mmu
Вопрос:
В x86 или x64 Linux я пытаюсь создать модуль ядра, который изменяет конкретное разрешение страницы ядра, чтобы разрешить пользовательскому приложению доступ к этой памяти. Например, если есть читаемая страница ядра с 0xC0001000 (скажем, она разделена на 3: 1), я хочу изменить бит пользователя / супервизора на этой странице и разрешить пользовательским приложениям делать что-то подобное.
int* m = 0xC0001000;
printf("reading kernel memory from user : xn", *m);
В моем модуле ядра я изменил бит доступа к соответствующей странице памяти ядра с 0x67 на 0x63 (младшие биты 111 -> 011), очистив бит супервизора.
После этого я сбросил TLB виртуального адреса 0xc0001000, используя инструкцию invdpg. Я подтвердил, что запись страницы, которой я манипулировал, действительно была соответствующей. Однако доступ к 0xC0001000 из пользовательского приложения по-прежнему вызывает у меня ошибку сегментации. Я пропустил что-то важное здесь? возможно, cs-сегмент и GDT? или это не имеет значения?
Было бы неплохо дать несколько советов, заранее благодарю вас 🙂
Ответ №1:
Из вашего модуля ядра вы можете просто изменить эффективный идентификатор пользователя на 0, чтобы он мог читать /dev/kmem
,
Комментарии:
1. Спасибо, но это не то, чего я хочу… я хочу, чтобы пользовательское приложение (CPL3) напрямую обращалось к виртуальному адресу ядра. это самоцель
2. @daehee Ну,
/dev/kmem
это виртуальное адресное пространство ядра, и для приложения пользовательского пространства для доступа к нему все, что ему нужно, — это привилегия root.