Вопрос или проблема
Интерфейс программирования Linux показывает расположение виртуального адресного пространства процесса:
Является ли ядро в физической памяти полностью или частично отображенным на часть “Ядро” сверху с 0xC0000000 до 0XFFFFFFFF в виртуальном адресном пространстве каждого процесса?
Если частично, какая часть ядра в физической памяти отображается на
часть “Ядро” в виртуальном адресном пространстве каждого процесса, а какая часть не отображается?
Содержит ли часть “Ядро” в виртуальном адресном пространстве процесса именно ту часть кода ядра, которая доступна процессу, когда он работает в режиме ядра, а не ту часть кода ядра, которая недоступна?
Имеют ли виртуальные адресные пространства всех процессов одинаковое содержание в своих частях “Ядро”?
Ответ зависит от того, включена ли изоляция таблицы страниц ядра (что зависит от архитектуры и поддержки KPTI).
Без KPTI ядро полностью отображается в адресном пространстве каждого процесса, но, как упоминалось в диаграмме, эти отображения недоступны из пользовательского пространства (за исключением утечек через побочные каналы).
С KPTI таблицы страниц ядра отделены от таблиц страниц пользовательского пространства, и в адресном пространстве каждого процесса оставляется только минимальный набор отображений, необходимых для того, чтобы пользовательское пространство могло вызывать ядро и чтобы процессор мог передать управление ядру при обработке прерываний или исключений.
В обоих случаях все процессы имеют одни и те же отображения для ядра.
Смотрите также статью LWN о KAISER.
Ответ или решение
Виртуальные адресные пространства процессов в операционных системах, таких как Linux, имеют сложную архитектуру, значение которой может варьироваться в зависимости от различных факторов, таких как поддержка функций, таких как изоляция таблиц страниц ядра (KPTI).
### 1. Полное или частичное отображение ядра
Когда речь идет о виртуальных адресных пространствах процессов, важно понимать, как именно осуществляется отображение части “Ядро”. В классическом варианте Linux без использования KPTI, все страницы памяти ядра полностью отображаются в адресном пространстве каждого процесса. Это означает, что виртуальный адрес от 0xC0000000 до 0xFFFFFFFF используется для отображения всей области физической памяти, зарезервированной под ядро.
Однако в режиме с включенной KPTI, отображение ядра становится частичным. Это связано с тем, что KPTI применяет отдельные таблицы страниц для пользовательского и ядрового пространств. В результате в адресном пространстве процесса остаются лишь минимальные маппинги ядра, необходимые для выполнения системных вызовов и обработки прерываний при переходе управления от пользователя к ядру. Это сделано для повышения безопасности и защиты от утечек информации через побочные каналы.
### 2. Доступные части ядра для процесса
В контексте вопроса о том, какие части кода ядра являются доступными для процесса, ответ заключается в том, что в “Ядровой” части виртуального адресного пространства процесса хранится только та часть кода, которая необходима для выполнения вызовов из пользовательского режима. Остальные части ядра, воздействующие на системное состояние или содержащие конфиденциальную информацию, не отображаются и, следовательно, недоступны.
### 3. Сравнение “Ядра” в виртуальных адресных пространствах разных процессов
Теперь, что касается вопроса о том, имеют ли виртуальные адресные пространства всех процессов одинаковое содержание в разделе “Ядро”, ответ – да, в основном. Несмотря на то, что при наличии KPTI маппинги ядра могут варьироваться в зависимости от конкретных требований ресурсов и безопасности, все процессы в системе используют одинаковые физические адреса для доступа к своему ядру в пространстве виртуальной памяти. Это означает, что во всех процессах могут быть отображены одни и те же физические адреса, однако из- за системы защиты может быть доступна только часть из них.
### Заключение
Таким образом, можно сделать вывод, что виртуальные адресные пространства всех процессов действительно имеют одинаковую “Ядровую” часть, если рассматривать физические отображения, но доступ к هذه частям может быть ограничен безопасностью и конфиденциальностью. Система управления памятью Linux обеспечивает необходимую гибкость, чтобы балансировать между эффективностью и безопасностью, подразумевая, что следует учитывать не только архитектуру процессора, но и действующие настройки безопасности.