Friday, May 18th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Управление памятью Исполнение файла

Исполнение файла

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

Чтобы выполнить exec, система должна выделить ресурсы для сохранения нового содержимого виртуального адресного пространства, установить отображение в это адресное пространство нового образа и освободить ресурсы, использовавшиеся для существующей виртуальной памяти.

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

Теперь у процесса есть только структура пользователя и стек ядра. Ядро выделяет новую структуру vmspace и создает список четырех структур vm_map_entry.

Элемент с копированием при записи, с заполнением из файла отображает сегмент кода. Используется копирование при записи, а не доступ только для чтения, чтобы дать активным кодовым сегментам возможность иметь установленные отладочные точки останова, не влияя на других пользователей двоичного файла. В FreeBSD некоторый унаследованный код в отладочном интерфейсе ядра не позволяет устанавливать точки останова в двоичных файлах, используемых более чем одним процессом. Этот унаследованный код не разрешает использовать особенность копирования при записи и требует, чтобы код отображался с доступом только для чтения.

Индивидуальный (копирование при записи) элемент с заполнением из файла отображает сегмент инициализированных данных.

Анонимный заполняемый по требованию нулями элемент отображает сегмент неинициализированных данных. Анонимный заполняемый по требованию нулями элемент отображает сегмент стека.

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


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 55 гостей онлайн