Формат загрузочного модуля a.out

В системе UNIX на 32-разрядных машинах также используется абсолютная за­грузка. Загружаемый файл формата a.out (современные версии Unix использу­ют более сложный формат загружаемого модуля и более сложную схему за­грузки, которая будет обсуждаться в разд. 5.4) начинается с заголовка, который содержит:

• "магическое число" — признак того, что это именно загружаемый модуль, а не что-то другое;

• число text_size —длину области кода программы (text);

• data_size — длину области инициализованных данных программы (data); !

• bss_size — длину области неинициализованных данных программы (bss);

• стартовый адрес программы.

За заголовком следует содержимое областей text и data. Затем может сле­довать отладочная информация. Она нужна символьным отладчикам, но самой программой не используется.

При загрузке система выделяет процессу text_size байтов виртуальной па­мяти, доступной для чтения/исполнения, и копирует туда содержимое сегмента text. Затем отсчитывается data__size байтов памяти, доступной для чтений/ записи, и туда копируется содержимое сегмента data. Затем отсчитывается

еще bss_size байтов памяти, доступной для чтения/записи, которые прописы­ваются нулями.

Очистка выделяемой памяти нужна не столько для удобства программиста, сколько по соображениям безопасности: перед вновь загружаемым процессом эту память могли занимать (а при сколько-нибудь длительной работе системы почти наверняка занимали) другие процессы, которые могли использовать эту память для хранения важных и секретных данных, например паролей или клю­чей шифрования.

После этого выделяется пространство под стек, в стек помещаются позицион­ные аргументы и среда исполнения (environment), и управление передается на стартовый адрес. Процесс начинает исполняться.