Иллюстрированный самоучитель по теории операционных систем

Абсолютная загрузка

Первый, самый простой, вариант состоит в том, что мы всегда будем загружать программу с одного и того же адреса. Это возможно в следующих случаях.

  • Система может предоставить каждому процессу свое адресное пространство. Это возможно только на процессорах, осуществляющих трансляцию виртуального адреса в физический.
  • Система может исполнять в каждый момент только один процесс. Так ведет себя СР/М, так же устроено большинство загрузочных мониторов для самодельных компьютеров. Похожим образом устроена система 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), и управление передается на стартовый адрес. Процесс начинает исполняться.

Иллюстрированный самоучитель по теории операционных систем › Загрузка программ › Абсолютная загрузка
Рис. 3.1. Загрузочный модуль a.out

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.