- •Глава 4. Представление машинных команд. Загрузка программ.
- •Машинные команды. Загрузочный модуль
- •2. Загрузка программ
- •2.1 Абсолютная загрузка
- •2.3 Оверлеи (перекрытия)
- •3. Сборка программ
- •3.1 Понятие сборки модулей
- •3.2 Объектные библиотеки
- •3.3 Сборка в момент загрузки
- •3.4 Динамические библиотеки
- •4. Загрузка самой ос
2.3 Оверлеи (перекрытия)
Еще более интересный способ загрузки программы – это оверлейная загрузка (over – lay, лежащий сверху)или, как это называли в старой русскоязычной литературе,перекрытие. Смысл оверлея состоит в том, чтобы не загружать программу в память целиком, а разбить ее на несколько модулей и помещать их в память по мере необходимости. При этом на одни и те же адреса в различные моменты времени будут отражены разные модули. Отсюда и название.
Резидентное ядро |
оверлей 1 (загружен) |
Оверлей 3 |
Оверлей 2 |
Оверлей 4 |
Потребность в таком способе загрузки появляется, если у нас виртуальное адресное пространство мало, например 1 Мбайт или даже всего 64 Кбайт, а программа относительно велика. В современных системах виртуальное адресное пространство обычно измеряется гигабайтами, и большинству программ этого хватает, а проблемы с нехваткой можно решать совсем другими способами. Тем не менее, существуют различные системы, даже и 32 – разрядные, в которых нет устройства управления памятью, и размер виртуальной памяти не может превышать объема микросхем ОЗУ, установленных на плате. Основная проблема при оверлейной загрузке состоит в следующем: прежде чем ссылаться на оверлейный адрес, мы должны понять, какой из оверлейных модулей в данный момент там находится. Иногда такие действия возлагаются на программиста, иногда на компилятор, но чаще всего с оверлейными данными предпочитают не иметь дела. С целью ускорения чтения с диска отдельных оверлеев нужно, чтобы каждый оверлейный модуль был как можно самодостаточным. Если это невозможно, стараются вынести процедуры, на которые ссылаются из нескольких оверлеев, в отдельный модуль, называемый резидентной частью илирезидентным ядром- он всегда находится в ОП и не разделяет свои адреса ни с каким другим оверлеем. Каждый оверлейный модуль может быть как абсолютным, так и перемещаемым.
3. Сборка программ
3.1 Понятие сборки модулей
Способ создания загружаемого модуля различен в различных ОС.
В некоторых современных языках программирования программа состоит из слабо связанных модулей. Как правило, каждому такому модулю соответствует отдельный файл исходного текста. Эти файлы независимо обрабатываются языковым процессором (компилятором), и для каждого из них генерируется отдельный файл, называемый объектным модулем. Затем запускается программа, называемаяредактором связей, компоновщиком илилинкером (linker – тот, кто связывает), которая формирует из заданных объектных модулей цельную программу.
Объектный модуль отчасти похож на перемещаемый загрузочный модуль: сборку программы из нескольких модулей можно уподобить загрузке в память нескольких программ. При этом возникает та же задача перенастройки адресных ссылок, что и при загрузке относительного загрузочного файла . Поэтому объектный модуль должен в той или иной форме содержать таблицу перемещений. Кроме ссылок на собственные метки, объектный модуль имеет право ссылаться на символы, определенные в других модулях. Типичный пример такой ссылки – обращение к функции, которая определена в другом файле исходного текста .
Для разрешения внешних ссылок необходимо создать две таблицы: в одной перечислены внешние объекты, на которые ссылается модуль, в другой – объекты, определенные внутри модуля, на которые можно ссылаться извне. Кроме того, в объектных файлах может содержаться отладочная информация, формат которой может быть очень сложным. Следовательно, объявленный файл представляет собой довольно сложную структуру.
Типичный объектный модуль содержит следующие структуры данных.
Таблицу перемещений, т. е. таблицу ссылок на перемещаемые объекты внутри модуля.
Таблицу ссылок на внешние объекты. Иногда это называется таблицей или списком импорта.
Таблицу объектов, определенных в этом модуле, на которые можно ссылаться из других модулей. В некоторых случаях ее называют списком экспорта..
Отладочную информацию
Собственно код и данные модуля