Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_ОПЕРАЦИОННЫЕ СИСТЕМЫ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
642.56 Кб
Скачать

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

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

□ Система может предоставить каждому процессу свое адресное пространство. Это возможно только на процессорах, осуществляющих трансляцию виртуального адреса в физический.

□ Система может исполнять в каждый момент только один процесс. Так ведет себя СР/М, так же устроено большинство загрузочных мониторов для самодельных компьютеров. Похожим образом устроена система RT-11, но о ней чуть ниже.

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

Начальное содержимое образа процесса формируется путем простого копи­рования модуля в память. В системе RT-11 такие файлы имеют расширение sav от saved — сохраненный.

Формат загрузочного модуля 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), и управление передается на стартовый адрес. Процесс начинает исполняться.

3.2. Разделы памяти

Одним из способов обойти невозможность загружать более одной програм­мы при абсолютной загрузке являются разделы памяти. В наше время этот метод практически не применяется, но в машинах второго поколения; использоваться относительно широко и часто описывается в старой литературе. Идея метода состоит в том, что мы задаем несколько допустимых стартовых адресов абсолютной загрузки. Каждый такой адрес определяет раздел памяти. Процесс может размещаться в одном разделе, или, если это необходимо – т.е. если образ процесса слишком велик - в нескольких. Это позволяет загружать несколько процессов одновременно, сохраняя при этом преимущества абсолютной загрузки.

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