- •Операционные системы История появления
- •Основные функции операционных систем
- •Классификация операционных систем
- •Семейства операционных систем
- •Выбор операционной системы
- •Открытые системы
- •Представление данных в вычислительных системах Представление чисел
- •Представление текстовых данных
- •Представление изображений
- •Прорисовка букв и цифр. Шрифты
- •Представление звуков
- •Упаковка данных
- •Контроль целостности информации
- •Введение в криптографию
- •Загрузка программ
- •Абсолютная загрузка
- •Разделы памяти
- •Относительная загрузка
- •Базовая адресация
- •Позиционно-независимый код
- •Оверлеи (перекрытия)
- •Сборка программ
- •Сборка в момент загрузки
- •Динамические библиотеки
- •Загрузка самой ос
- •Управление оперативной памятью
- •Открытая память
- •Алгоритмы динамического управления памятью
- •Сборка мусора
- •Системы с базовой виртуальной адресацией
- •Параллельное выполнение процессов
- •Системы, управляемые событиями
- •Windows9Xкак пример системы, управляемой событиями
- •Реализация многозадачности на однопроцессорных компьютерах
- •Внешние устройства
- •Доступ к внешним устройствам
- •Простые внешние устройства
- •Порты передачи данных
- •Шины передачи данных
- •Устройства графического вывода
- •Запоминающие устройства прямого доступа
- •Драйверы внешних устройств
- •Функции драйверов
- •Многоуровневые драйверы
- •Загрузка драйверов
Разделы памяти
Одним из способов обойти невозможность загружать более одной программы при абсолютной загрузке являются разделы памяти. В наше время этот метод практически не применяется, но в машинах второго поколения использовался относительно широко и часто описывается в старой литературе.
Идея метода состоит в том, что мы задаем несколько допустимых стартовых адресов для абсолютной загрузки. Каждый такой адрес определяет раздел памяти. Процесс может размещаться в одном разделе, или, если это необходимо – т. е. если образ процесса слишком велик – в нескольких. Это позволяет загружать несколько процессов одновременно, сохраняя при этом преимущества абсолютной загрузки. Если мы не знаем, в какой из разделов пользователь вынужден будет загружать нашу программу, мы должны предоставить по отдельному загрузочному модулю на каждый из допустимых разделов. Понятно, что это не очень практично, поэтому разделы были вытеснены более удобными схемами управления памятью.
Относительная загрузка
Относительный способ загрузки состоит в том, что мы загружаем программу каждый раз с нового адреса. При этом мы должны настроить ее на новые адреса. При использовании в коде программы абсолютной адресации мы должны найти адресные поля всех команд, использующих такую адресацию, и пересчитать эти адресные поля с учетом реального адреса загрузки. Если в коде программы применялись косвенно-регистровый, базовый и базово-индексный режимы адресации, следует найти те места, где в регистр загружается значение адреса.
Сложность здесь в том, что если абсолютные адресные поля можно найти анализом кодов команд (деассемблированием), то значение в адресный регистр может загружаться задолго до собственно адресации, причем формирование значения регистра может происходить и по частям. На практике содействие программиста загрузчику состоит в том, что программист старается без необходимости не использовать в адресных полях и в качестве значений адресных регистров произвольные значения. Вместо этого, программист применяет ассемблерные символы, соответствующие адресам. Ассемблер при каждой ссылке на такой символ генерирует не только “заготовку” адреса в коде, но и запись в таблице перемещений (relocation table). Эта запись хранит место ссылки на такой символ в коде или данных.
В качестве "заготовки" адреса обычно используется смещение адресуемого объекта от начала программы. При настройке программы на реальный адрес загрузки нам, таким образом, необходимо пройти по всем объектам, перечисленным в таблице перемещений, и переместить каждую из ссылок – сформировать из заготовки адрес.
Файл, содержащий таблицу перемещений, гораздо сложнее абсолютного загружаемого модуля и носит название относительного или перемещаемого загрузочного модуля. Именно такой формат имеют ехе-файлы в системе MS DOS.
Наиболее поучительна в этом отношении система RT-11, в которой существуют загружаемые модули обоих типов. Обычные программы имеют расширение sav, представляют собой абсолютные загружаемые модули и грузятся всегда с адреса 01000. Ниже этого магического адреса находятся векторы прерываний и стек программы. Сама операционная система вместе с драйверами размещается в верхних адресах памяти. Естественно, нельзя загрузить одновременно два sav-файла.
Однако, если обязательно нужно исполнять одновременно две программы, можно собрать вторую из них в виде относительного модуля: файла с расширением rel. Такая программа будет загружаться в верхние адреса памяти, каждый раз разные, в зависимости от конфигурации ядра системы, количества загруженных драйверов устройств и других геl-модулей.