Абсолютная загрузка
Первый, самый простой, вариант состоит в том, что мы
всегда будем загружать программу с одного и того же адреса. Это возможно
в следующих случаях.
- Система может предоставить каждому процессу свое адресное
пространство. Это возможно только на процессорах, осуществляющих трансляцию
виртуального адреса в физический.
- Система может исполнять в каждый момент только один
процесс. Так ведет себя СР/М, так же устроено большинство загрузочных
мониторов для самодельных компьютеров. Похожим образом устроена система
RT-11, но о ней чуть ниже.
Загрузочный файл, используемый при таком способе загрузки,
называется абсолютным загрузочным модулем.
Начальное содержимое образа процесса формируется путем простого копирования
модуля в память. В системе RT-11 такие файлы имеют расширение sav от saved
— сохраненный.
Формат загрузочного модуля a.out
В системе UNIX на 32-разрядных машинах также используется абсолютная загрузка.
Загружаемый файл формата a.out (современные версии Unix используют более
сложный формат загружаемого модуля и более сложную схему загрузки, которая
будет обсуждаться в разд. Разделяемые
библиотеки) начинается с заголовка (рис. 3.1), который содержит:
• "магическое число" — признак того, что это именно загружаемый
модуль, а не что-то другое;
• число TEXT_SIZE — длину области кода программы (TEXT);
• DATA_SIZE —длину области инициализованных данных программы (DATA);
• BSS_SIZE —длину области неинициализованных данных программы (BSS);
• стартовый адрес программы.
За заголовком следует содержимое областей TEXT и DATA. Затем может следовать
отладочная информация. Она нужна символьным отладчикам, но самой программой
не используется.
При загрузке система выделяет процессу TEXT_SIZE байтов виртуальной памяти,
доступной для чтения/исполнения, и копирует туда содержимое сегмента TEXT.
Затем отсчитывается DATA_SIZE байтов памяти, доступной для чтения/ записи,
и туда копируется содержимое сегмента DATA. Затем отсчитывается
еще BSS_SIZE байтов памяти, доступной для чтения/записи, которые прописываются
нулями.
Очистка выделяемой памяти нужна не столько для удобства программиста,
сколько по соображениям безопасности: перед вновь загружаемым процессом
эту память могли занимать (а при сколько-нибудь длительной работе системы
почти наверняка занимали) другие процессы, которые могли использовать
эту память для хранения важных и секретных данных, например паролей или
ключей шифрования.
После этого выделяется пространство под стек, в стек помещаются позиционные
аргументы и среда исполнения (environment), и управление передается на
стартовый адрес. Процесс начинает исполняться.
Рис. З.1. Загрузочный модуль a.out
|