Изменение разрешения страницы ядра для разрешения доступа пользователя

#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.