когда вы вызываете exec, ядро загрузит двоичный файл и настроит новый набор таблиц страниц (заменив старые).
Загрузчик получает адрес для загрузки двоичного файла из самого двоичного файла (в основном он делает read()
, чтобы получить заголовки и данные, которые не являются кодом, затем mmap()
для фактической загрузки кода / данных вдвоичный файл)
, поэтому он смотрит на двоичный файл и выясняет, как он должен быть загружен, делает mmap()
, передавая адрес для сопоставления для каждой части двоичного файла, который должен быть вдругое место (т. е. секции кода и данных, вероятно, представляют собой два разных вызова mmap()
, а секция .bss будет отображаться из / dev / zero)
Обратите внимание, что в зависимости от ОС и загружаемого двоичного файла некоторыеэти вещи могут быть обработаны ядром напрямую или загрузчиком пространства пользователя (в системах UNIX ld будет загрузчиком, он обрабатывает загрузку общего объекта)