Что находится внутри ядра виртуальной памяти 64-битных процессов Linux?

Вопрос или проблема

Я наткнулся на этот вопрос:

Какова польза наличия части ядра в виртуальном адресном пространстве процессов Linux?

и на основе ответа и комментариев к ответу:

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

Это правда? Я не смог найти никаких источников или ссылок на это, и почему бы включать карту всей физической памяти, а потом еще раз иметь отдельное отображение модулей ядра? Разве это не избыточно?

Может кто-то объяснить простым способом, что находится внутри части ядра виртуальной памяти процессов в 64-битных системах Linux? и пожалуйста, предоставьте источник для ответа! так как я ничего не смог найти по этому поводу ни в книгах, ни в статьях.

Карта памяти ядра на x86-64 документирована в самом ядре. Ядро отображает

  • пользовательское пространство (для текущего процесса)
  • структуры данных PTI
  • всю физическую память
  • структуры данных ядра, в различных блоках, с промежутками для ASLR
  • само ядро
  • его модули

Наличие полного отображения физической памяти удобно, но его актуальность обсуждается по сравнению с теми рисками для безопасности, которые оно создает, и его нагрузкой на адресное пространство (так как физическая память фактически ограничена половиной адресного пространства в результате; это вызвало недавнее расширение до пятиуровневых таблиц страниц с 56-битными адресами).

«64-битное адресное пространство огромное. Вы просто не поверите, насколько оно огромное, колоссальное, невероятное. Я имею в виду, вы можете думать, что путь до аптеки долгий, но это просто мелочь по сравнению с 64-битным адресным пространством.»

Хорошо сохранять вещи простыми.

Поэтому было решено выделить половину для прямого отображения аппаратного обеспечения, просто одно к одному отображение адресов оборудования. И половина для виртуального отображения. Дешевле что-то включить туда дважды, чем нет. Представьте себе, что необходимо условное кодирование, чтобы исключить вещи из прямого отображения, если они есть в другом. А теперь представьте, насколько сложными станут вещи, теперь не все в прямом отображении, поэтому нам требуется гораздо больше условного кода, чтобы найти то, что мы хотим. Так просто проще отобразить это дважды. (это может быть чрезмерное упрощение, и некоторые детали могут быть неверными, но общая идея верна.)

.

Ответ или решение

Виртуальная память в Linux — это фундаментальная часть операционной системы, которая поддерживает изоляцию и управляемость ресурсов между различными процессами. Для 64-битных систем, таких как x86-64, виртуальная память значительно расширяет возможности управления огромными объемами данных и предоставляет возможность эффективной работы приложений и самой операционной системы. Но что же на самом деле содержится в ядре виртуальной памяти процессов в 64-битной версии Linux? Давайте исследуем этот вопрос подробно.

Теория

Ядро Linux организовано таким образом, чтобы эффективно использовать большие объемы адресного пространства, предоставляемого 64-битной архитектурой. В x86-64 адресное пространство состоит из 2^64 потенциальных адресов, что эквивалентно 16 эксабайтам. В этом просторном адресном пространстве ядро выделяет верхнюю половину для своего использования, а нижнюю — для пользовательских процессов.

Области памяти в ядре:

  1. Прямое отображение всей физической памяти: Ядро Linux включает в себя прямое отображение всего физического адресного пространства. Это означает, что каждый байт в физической памяти соответствует виртуальному адресу в верхней половине пространства адресов. Это позволяет ядру быстро и эффективно вести работу с физической памятью без сложных преобразований.
  2. Модули ядра: Модули ядра загружаются в отдельные области в виртуальном адресном пространстве. Это удобно для управления модулями, поскольку позволяет изолировать их от основного кода ядра, что облегчает их загрузку, выгрузку и управление.
  3. Структуры данных и ядро: Основной код ядра и его структуры данных также находятся в этой части адресного пространства. Они включают в себя коды, которые непосредственно выполняют управление процессами, памятью, устройствами и сетевым взаимодействием.
  4. ASLR (Address Space Layout Randomization): Для повышения безопасности ядро использует технику рандомизации расположения своих ключевых структур данных. Это усложняет потенциальным злоумышленникам предсказание местоположения критических кусков кода или данных.
  5. PTI (Page Table Isolation): В ответ на уязвимости, такие как Meltdown, в ядре была внедрена новая структура данных, которая изолирует таблицу страниц ядра от таблиц страниц пользователей.

Пример

Допустим, наш процесс запрашивает доступ к части физической памяти. Благодаря прямому отображению физической памяти в виртуальном адресном пространстве ядра, процесс ядра может быстро рассчитать виртуальный адрес, соответствующий нужному физическому адресу, и получить к нему доступ. Внедрение PTI позволяет изолировать пользовательскую и ядровую страницы, снижая риски доступа к ним через потенциальные атаки.

Применение

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

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

Заключение

Виртуальная память в 64-битных системах Linux — это результат длительной эволюции технологий распределения памяти, включающий современные механизмы производительности и безопасности. Ядро распространяет свои ресурсы на огромных пространствах данных, позволяя системе работать быстрее, безопаснее и более надежно.

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

Друзья помогите этому контенту стать доступнее в социальных сетях.

Не проходи мимо жмакни по кнопке возможно кому то еще он будет полезен!