Does it keep the.text region in place, but create a copy of.data region?
В любом случае
exec()
работает так же, какmmap()
сMAP_PRIVATE
. Страницы отображаются в виртуальном адресном пространстве процессов только для чтения -. Поэтому записи вызывают прерывание по ошибке страницы. Способ обработки этих ошибок страницы описан как Копирование при записи .В случае DAX виртуальные страницы начинаются как сопоставленные с физическими страницами на устройстве. Но ошибки записи страницы на MAP _PRIVATE скопируют данные страницы на новую страницу в ОЗУ. (Затем отображение процессов обновляется соответствующим образом, и прерванная программная инструкция перезапускается ).
Обратите внимание, что DAX является обобщением XIP, позволяющим выполнять как запись, так и чтение, т. е. MAP _SHARED, а также MAP _PRIVATE. MAP _SHARED можно использовать, например, для файлов базы данных.
На самом деле,
.text
также может быть написано в случае разделяемых библиотек. библиотеки, которые не являются позиционно-независимыми исполняемыми файлами и содержат ссылки на самих себя, нуждаются в обновлении этих ссылок в соответствии с тем, по какому адресу была загружена соответствующая библиотека. Этот процесс называется «переселением». Библиотеки также ссылаются на другие библиотеки, например. библиотека; обновление этих ссылок называется «разрешением символов».Even if the kernel or its modules are stored on a filesystem that supports DAX on a block device that supports DAX, they will still be copied into RAM.
Модули ядра являются особыми.Они также требуют разрешения символов. Но ядро не использует COW. (В более общем случае он не использует пейджинг по запросу -для своего кода и сегментов данных ). Ошибки страниц внутри ядра фатальны, потому что их обработка может привести к бесконечной рекурсии! Поэтому до -DAX было ясно, что модули ядра необходимо копировать в оперативную память целиком. Код ядра и сегменты данных небольшие; когда DAX был реализован, было бы бесполезно возиться с этим на серверах с адресным хранилищем байтов -.
Само ядро исторически сжато, очевидно, оно распаковано в оперативную память.
Тем не менее, XIP поддерживается для несжатых ядер . Обычно это используется во «встроенной» системе, то есть на довольно ограниченном оборудовании. В этот момент, вероятно, не проблема сделать большую часть необходимого кода встроенной -, в отличие от использования загружаемых модулей.