Вопрос или проблема
Я наткнулся на этот вопрос:
Какова польза от наличия части ядра в виртуальном адресном пространстве процессов Linux?
и на основе ответа и комментариев к ответу:
карта памяти ядра включает прямое отображение всей физической памяти, так что всё, что находится в памяти, появляется там; она также включает отдельные отображения для ядра, модулей и т. д., так что физические адреса содержащие ядро появляются минимум в двух разных отображениях
Это правда? Я не смог найти источник или ссылку на это, и зачем включать карту всей физической памяти, а затем вновь создавать отдельное отображение модулей ядра? Разве это не избыточно?
Может кто-нибудь объяснить простым языком, что находится внутри части ядра виртуальной памяти процессов в 64-битном Linux? и пожалуйста, предоставьте источник для ответа! потому что я не смог найти ничего, связанного с этим, ни в одной книге или статье.
Карта памяти ядра на x86-64 документирована в самом ядре. Ядро отображает
- пространство пользователя (для текущего процесса)
- структуры данных PTI
- всю физическую память
- структуры данных ядра, в различных блоках, с пробелами для ASLR
- само ядро
- свои модули
Наличие полного отображения физической памяти удобно, но его значимость обсуждается в сравнении с создаваемыми им рисками для безопасности и нагрузкой на адресное пространство (поскольку в результате физическая память фактически ограничена до половины адресного пространства; это вызвало недавнее расширение до пятиуровневых таблиц страниц с 56-битными адресами).
«64-битное адресное пространство огромно. Вы просто не поверите, насколько бесконечно, невероятно огромное оно. То есть, вы можете думать, что путь до аптеки длинный, но это просто пустяки по сравнению с 64-битным адресным пространством.»
Важно сохранять простоту.
Поэтому было решено выделить половину для прямого отображения оборудования, простого однозначного отображения адресов оборудования. И половину для виртуального отображения. Дешевле иметь что-то там дважды, чем нет. Представьте, что нужно было бы написать условный код, чтобы исключить что-то из прямого отображения, если оно уже в другом. И представьте, насколько более сложным всё бы стало, если теперь не всё находится в прямом отображении, и нам нужно было бы много условного кода, чтобы найти то, что нам нужно. Это просто проще отображать дважды. (это может быть чрезмерно упрощено, и некоторые детали могут быть неверны, но общая идея верна.)
Ответ или решение
В архитектуре 64-битных систем Linux важным элементом является виртуальная память, которая упрощает управление физическими ресурсами и обеспечивает безопасность и стабильность работы процессов. Разделение адресного пространства на пользовательскую и системную части позволяет операционной системе эффективно управлять ресурсами и защищать критические данные.
Теория
Ядро Linux использует сегмент виртуальной памяти, который часто называют «ядром». Этот участок зарезервирован для исполнения кода ядра, работы с модулями, управления аппаратными средствами и хранения специализированных данных системы. В 64-битной архитектуре x86-64, половина адресного пространства зарезервирована под ядро, то есть старшая половина, начиная с адреса 0xffff800000000000.
Вот основные компоненты, которые включаются в ядро части виртуальной памяти:
- Карта всей физической памяти: Ядро создает прямое отображение всей физической памяти. Это полезно для простоты доступа и быстродействия, так как позволяет ядру напрямую манипулировать физическими адресами.
- Данные ядра и его структуры: Здесь хранятся внутренние данные операционной системы, включая таблицы страниц, данные планировщика задач, очереди событий и прочие критически важные системы.
- Область кода ядра: В этой области хранится непосредственно исполняемый код ядра. Ядро является основой системы, выполняя управление процессами, памятью, вводом-выводом и передачей управления между программами.
- Модули ядра: Это динамически подключаемые компоненты, которые могут исполняться в пространстве ядра. Модули позволяют расширять функциональность системы без необходимости перекомпилировать ядро.
- Резервные блоки памяти и структуры для защиты доступа: Они используются для настройки адресного пространства с помощью механизмов ASLR (Address Space Layout Randomization) и других методов защиты.
Пример
Как пример, рассмотрим, как Linux позволяет приложениям взаимодействовать с физической памятью без нарушения изолированности процессов. Если процессу необходимо получить доступ к физической памяти (например, для взаимодействия с устройством), ядро может предоставить этот доступ через системные вызовы, не раскрывая полной картины физической памяти всем процессам. Прямое отображение физической памяти в пространство ядра также ускоряет работу драйверов устройств, упрощая доступ к ресурсам.
Применение
Использование большого виртуального пространства памяти помогает упростить проектирование и разработку системного ПО. Для разработчиков осознание того, что каждый процесс имеет изолированное пространство, а работа с физической памятью идет через контролируемые механизмы, помогает создавать безопасные и эффективные приложения.
Следует отметить, что краткая структура описания может не учитывать все аспекты, и хотя прямое отображение физической памяти увеличивает риск безопасности (например, угрозы рода Meltdown и Spectre), современные системы применяют методы защиты, минимизирующие эти риски.
Заключение
Таким образом, ядро внутри виртуальной памяти Linux объединяет множество решающих элементов, от управления доступом до физической памяти, до обеспечения защиты и эффективности. Это сложная, но обоснованная архитектура, предоставляющая как разработчикам, так и пользователям современные и надежные функции управления ресурсами, что делает Linux одной из наиболее популярных операционных систем в мире.