Системная функция exec дает возможность процессу запускать другую программу, при этом соответствующий этой программе исполняемый файл будет располагаться в пространстве памяти процесса. Содержимое пользовательского контекста после вызова функции становится недоступным, за исключением передаваемых функции параметров, которые переписываются ядром из старого адресного пространства в новое. Синтаксис вызова функции:
execve(filename, argv, envp)
где filename — имя исполняемого файла, argv — указатель на массив параметров, которые передаются вызываемой программе, а envp — указатель на массив параметров, составляющих среду выполнения вызываемой программы. Вызов системной функции exec осуществляют несколько библиотечных функций, таких как execl, execv, execle и т. д. В том случае, когда программа использует параметры командной строки
main(argc, argv),
массив argv является копией одноименного параметра, передаваемого функции exec. Символьные строки, описывающие среду выполнения вызываемой программы, имеют вид «имя=значение» и содержат полезную для программ информацию, такую как начальный каталог пользователя и путь поиска исполняемых программ. Процессы могут обращаться к параметрам описания среды выполнения, используя глобальную переменную environ, которую заводит начальная процедура Си-интерпретатора.
алгоритм exec
входная информация:
(1) имя файла
(2) список параметров
(3) список переменных среды
выходная информация: отсутствует
{
получить индекс файла (алгоритм namei);
проверить, является ли файл исполнимым и имеет ли пользователь право на его исполнение;
прочитать информацию из заголовков файла и проверить, является ли он загрузочным модулем;
скопировать параметры, переданные функции, из старого адресного пространства в системное пространство;
for (каждой области, присоединенной к процессу)
отсоединить все старые области (алгоритм detachreg);
for (каждой области, определенной в загрузочном модуле)
{
выделить новые области (алгоритм allocreg);
присоединить области (алгоритм attachreg);
загрузить область в память по готовности (алгоритм loadreg);
}
скопировать параметры, переданные функции, в новую область стека задачи;
специальная обработка для setuid-программ, трассировка;
проинициализировать область сохранения регистров задачи (в рамках подготовки к возвращению в режим задачи);
освободить индекс файла (алгоритм iput);
}
Рисунок 7.19. Алгоритм функции exec
На Рисунке 7.19 представлен алгоритм выполнения системной функции exec. Сначала функция обращается к файлу по алгоритму namei, проверяя, является ли файл исполнимым и отличным от каталога, а также проверяя наличие у пользователя права исполнять программу. Затем ядро, считывая заголовок файла, определяет размещение информации в файле (формат файла).
На Рисунке 7.20 изображен логический формат исполняемого файла в файловой системе, обычно генерируемый транслятором или загрузчиком. Он разбивается на четыре части:
1. Главный заголовок, содержащий информацию о том, на сколько разделов делится файл, а также содержащий начальный адрес исполнения процесса и некоторое «магическое число», описывающее тип исполняемого файла.
2. Заголовки разделов, содержащие информацию, описывающую каждый раздел в файле: его размер, виртуальные адреса, в которых он располагается, и др.
3. Разделы, содержащие собственно «данные» файла (например, текстовые), которые загружаются в адресное пространство процесса.
4. Разделы, содержащие смешанную информацию, такую как таблицы идентификаторов и другие данные, используемые в процессе отладки.
Рисунок 7.20. Образ исполняемого файла
Указанные составляющие с развитием самой системы видоизменяются, однако во всех исполняемых файлах обязательно присутствует главный заголовок с полем типа файла.