Соответствует ли последний ГБ в адресном пространстве процесса linux той же физической памяти? - PullRequest
2 голосов
/ 21 мая 2011

Я прочитал, что первые 3 ГБ зарезервированы для процесса, а последний ГБ - для Ядра. Я также читал, что ядро ​​загружается, начиная со 2 МБ физического адресного пространства (в зависимости от конфигурации). Мой вопрос заключается в том, является ли отображение последних 1 ГБ одинаковым для всех процессов и отображается в этой физической области памяти?

Другой вопрос: когда процесс переключается в режим ядра (например, когда происходит вызов sys), тогда какие таблицы страниц используются, таблицы страниц процесса или таблицы страниц ядра? Если используются таблицы страниц ядра, то они не могут получить доступ к ячейкам памяти, принадлежащим процессу. Если это так, то, по-видимому, бесполезно использовать виртуальную память ядра, поскольку весь доступ к коду и данным ядра будет осуществляться через отображение последних 1 ГБ адресного пространства процесса. Пожалуйста, помогите мне уточнить это (любые полезные ссылки будут высоко оценены)

Ответы [ 2 ]

4 голосов
/ 22 мая 2011

Кажется, вы говорите о 32-битных системах x86, верно?

Если я не ошибаюсь, ядро ​​можно настроить не только для распределения памяти 3Gb / 1Gb, возможны и другие варианты (например, 2Gb / 2Gb).Тем не менее, 3Gb / 1Gb, вероятно, является наиболее распространенным на x86-32.

Часть адреса пространства ядра должна быть недоступна из пространства пользователя.С точки зрения ядра, да, отображение памяти, занимаемой самим ядром, всегда одинаково.Неважно, в контексте какого процесса (или обработчика прерываний, или чего-либо еще) работает ядро.

В качестве одного из следствий, если вы посмотрите на адреса символов ядра в /proc/kallsyms из разных процессов, вы будете видеть одни и те же адреса каждый раз.И это в точности адреса соответствующих функций ядра, переменных и других с точки зрения ядра.

Итак, я полагаю, ответ на ваш первый вопрос - «да», но, вероятно, он не очень полезен длякод пользовательского пространства как память пространства ядра в любом случае напрямую не доступен оттуда.

Что касается второго вопроса, хорошо, если ядро ​​в настоящее время работает в контексте какого-либо процесса, оно может фактически получить доступ к пользователюПространственная память об этом процессе.Я не могу описать это подробно, но, вероятно, реализация функций ядра copy_from_user и copy_to_user может дать вам несколько советов.Смотрите arch/x86/lib/usercopy_32.c и arch/x86/include/asm/uaccess.h в исходниках ядра.Кажется, в x86-32 доступ к памяти пользовательского пространства осуществляется непосредственно в этих функциях с использованием отображений памяти по умолчанию для текущего контекста процесса.«Волшебные» вещи там связаны только с оптимизацией и проверкой адреса области памяти на правильность.

2 голосов
/ 23 мая 2011

Да, отображение части ядра адресного пространства одинаково во всех процессах. Часть этого действительно отображает ту часть физической памяти, куда загружен образ ядра, но это не основная часть - остаток используется для сопоставления других мест физической памяти для рабочего набора времени выполнения ядра.

Когда процесс переключается в режим ядра, таблицы страниц не изменяются.Часть ядра адресного пространства просто становится доступной, поскольку CPL (текущий уровень привилегий) теперь равен нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...