Читаем Архитектура операционной системы UNIX полностью

Системная функция 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. Образ исполняемого файла

Указанные составляющие с развитием самой системы видоизменяются, однако во всех исполняемых файлах обязательно присутствует главный заголовок с полем типа файла.

Перейти на страницу:

Все книги серии Серия книг по программному обеспечению издательства prentice hall

Похожие книги