Системный вызов exec замещает адресное пространство процесса содержимым новой программы, полученной из исполняемого файла. Во время exec проверяется целевой исполняемый образ, а затем аргументы и переменные окружения копируются из текущего процесса во временную область выгружаемой виртуальной памяти ядра.
Чтобы выполнить exec, система должна выделить ресурсы для сохранения нового содержимого виртуального адресного пространства, установить отображение в это адресное пространство нового образа и освободить ресурсы, использовавшиеся для существующей виртуальной памяти.
Первым шагом является резервирование ресурсов памяти для нового исполняемого образа. Алгоритм для вычисления количества виртуального адресного пространства, которое должно быть зарезервировано. Для исполняемого файла, который не отлаживается (и пространство кода которого поэтому не будет изменяться), резервирование пространства должно быть выполнено лишь для пространства данных и стека нового исполняемого файла, exec осуществляет это резервирование без предварительного освобождения текущего назначенного пространства, поскольку система должна иметь возможность продолжать выполнение старого исполняемого файла, пока она не будет уверена, что она сможет запустить новый. Если бы система освободила текущее пространство, а резервирование памяти завершилось неудачей, exec не смог бы вернуться в первоначальный процесс. После осуществления резервирования адресное пространство и ресурсы виртуальной памяти текущего процесса освобождаются, как если бы процесс завершался.
Теперь у процесса есть только структура пользователя и стек ядра. Ядро выделяет новую структуру vmspace и создает список четырех структур vm_map_entry.
Элемент с копированием при записи, с заполнением из файла отображает сегмент кода. Используется копирование при записи, а не доступ только для чтения, чтобы дать активным кодовым сегментам возможность иметь установленные отладочные точки останова, не влияя на других пользователей двоичного файла. В FreeBSD некоторый унаследованный код в отладочном интерфейсе ядра не позволяет устанавливать точки останова в двоичных файлах, используемых более чем одним процессом. Этот унаследованный код не разрешает использовать особенность копирования при записи и требует, чтобы код отображался с доступом только для чтения.
Индивидуальный (копирование при записи) элемент с заполнением из файла отображает сегмент инициализированных данных.
Анонимный заполняемый по требованию нулями элемент отображает сегмент неинициализированных данных. Анонимный заполняемый по требованию нулями элемент отображает сегмент стека.
Для создания нового адресного пространства во время системного вызова exec не требуется дальнейших операций; оставшаяся часть работы включает копирование аргументов и переменных окружения в вершину нового стека. Для регистров устанавливаются начальные значения: счетчик команд устанавливается на точку входа, а указатель стека на вектор аргументов. После этого образ нового процесса готов к запуску.
- 29/10/2010 05:27 - Параметры страничной подкачки
- 29/10/2010 00:56 - Замещение страниц
- 28/10/2010 17:19 - Изменение размера процесса
- 28/10/2010 11:59 - Раскраска страниц (page coloring)
- 28/10/2010 08:07 - Манипулирование процесса своим адресным пространством
- 26/10/2010 11:57 - Дизайн аппаратного кеша
- 26/10/2010 07:21 - Дублирование адресного пространства пользователя
- 26/10/2010 06:04 - Зональный распределитель ядра
- 25/10/2010 19:26 - Резервирование ресурсов ядра
- 25/10/2010 16:31 - Создание нового процесса