Ядро чтения / записи памяти пользователя - PullRequest
1 голос
/ 17 января 2012

Сначала malloc буфер из пространства пользователя и заполнение буфера всеми 'A'
Затем, передайте указатель буфера ядру, используя сокет netlink,
Наконец, я могу читать и записывать буфер,используя необработанный указатель, непосредственно переданный из пространства пользователя.
Почему?
Почему прямой доступ к памяти пользовательского пространства из ядра разрешен?
Драйвер устройства Linux, третье издание, стр. 415, говорит, что ядро ​​не может напрямую манипулировать памятью, которая не отображается в адресное пространство ядра.

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Дело в том, что доступ к пользовательским адресам напрямую только в ядре иногда работает.

До тех пор, пока вы пытаетесь получить доступ к адресу пользователя в контексте того же процесса, который его выделил ичто процесс уже дал сбой, и вы используете ядро ​​с отображением памяти 3: 1 (в отличие от отображения 4: 4, которое иногда используется) и что ядро ​​не поменял страницу, на которой находится выделение -доступ будет работать.

Проблема в том, что все эти условия не всегда выполняются и могут меняться даже от времени выполнения программы к другому.Поэтому разработчики драйверов ядра не должны рассчитывать на возможность доступа к адресам пользователей.

Худшее, что может случиться, - это предположить, что он работает, всегда работать в лаборатории и иметь сбой присайт клиента время от времени.Это причина для утверждения книги.

0 голосов
/ 17 января 2012

В этой книге слова «Ядро не может напрямую манипулировать памятью, которая не отображена в адресном пространстве ядра» относятся к физической памяти.Другими словами - ядро ​​имеет только 800-900 МБ (на x86), которые могут быть сопоставлены с физической памятью за один раз.Для доступа ко всей физической памяти ядру необходимо постоянно переназначать этот регион.

Netlink вообще не имеет дело с физической памятью - он предназначен для двунаправленной связи между userpace <-> userspace или userspace <-> kernelspace.

...