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

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

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

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

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

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

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

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

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

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

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

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

Важно сохранять простоту.

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

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

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

Теория

Ядро Linux использует сегмент виртуальной памяти, который часто называют «ядром». Этот участок зарезервирован для исполнения кода ядра, работы с модулями, управления аппаратными средствами и хранения специализированных данных системы. В 64-битной архитектуре x86-64, половина адресного пространства зарезервирована под ядро, то есть старшая половина, начиная с адреса 0xffff800000000000.

Вот основные компоненты, которые включаются в ядро части виртуальной памяти:

  1. Карта всей физической памяти: Ядро создает прямое отображение всей физической памяти. Это полезно для простоты доступа и быстродействия, так как позволяет ядру напрямую манипулировать физическими адресами.
  2. Данные ядра и его структуры: Здесь хранятся внутренние данные операционной системы, включая таблицы страниц, данные планировщика задач, очереди событий и прочие критически важные системы.
  3. Область кода ядра: В этой области хранится непосредственно исполняемый код ядра. Ядро является основой системы, выполняя управление процессами, памятью, вводом-выводом и передачей управления между программами.
  4. Модули ядра: Это динамически подключаемые компоненты, которые могут исполняться в пространстве ядра. Модули позволяют расширять функциональность системы без необходимости перекомпилировать ядро.
  5. Резервные блоки памяти и структуры для защиты доступа: Они используются для настройки адресного пространства с помощью механизмов ASLR (Address Space Layout Randomization) и других методов защиты.

Пример

Как пример, рассмотрим, как Linux позволяет приложениям взаимодействовать с физической памятью без нарушения изолированности процессов. Если процессу необходимо получить доступ к физической памяти (например, для взаимодействия с устройством), ядро может предоставить этот доступ через системные вызовы, не раскрывая полной картины физической памяти всем процессам. Прямое отображение физической памяти в пространство ядра также ускоряет работу драйверов устройств, упрощая доступ к ресурсам.

Применение

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

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

Заключение

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

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

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