Варианты построения загрузчиков



Подготовка программы к выполнению сопряжена со следующими взаимосвязанными процессами:

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

2) Перемещением, которое позволяет модифицировать объектную программу так, что она может загружаться с адреса, отличного от первоначально заданного.

3) Связыванием, обеспечивающим объединение двух и более отдельно оттранслированных объектных программ и предоставляющим информацию, необходимую для разрешения ссылок между ними.

Связывание (сборка) выполняется специальной программой связывания, называемой также линкером или редактором связей.

Системная программа, выполняющая загрузку называется загрузчиком. Многие загрузчики обеспечивают, кроме того, перемещение и связывание.

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

Загрузчики, обеспечивающие перемещение программ называются перемещающими или относительными загрузчиками (relocating/relative loaders).

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

Существуют также схемы загрузки, в которых связывание откладывается до момента исполнения программы. В этом случае загрузка и связывание подпрограмм осуществляются тогда, когда к ней происходит первое обращение. Такая организация процесса загрузки обычно называется динамическим связыванием или динамической загрузкой.

Например связывающий загрузчик используется в Novell Netware

В системах MS Windows и OS/2 используется способ загрузки, промежуточный между сборкой в момент загрузки и сборкой заранее

 


Управление памятью. Основные положения размещения процессов в памяти

Управление памятью, наряду с управлением процессами и ресурсами, - одна из наиболее важных функций операционной системы. Задача ОС заключается в том, чтобы размещать в памяти пользовательские процессы, их данные, обслуживать запросы процессов на области памяти заданных размеров.

Любая программа, введенная в систему, должна быть размещена в памяти и оформлена в виде процесса для ее выполнения. Каждая программа при вводе в систему помещается во входную очередь – совокупность процессов на диске, ожидающих размещения в памяти для выполнения своих программ. До своего выполнения пользовательские программы проходят в системе несколько стадий.

Связывание программ и данных с адресами в памяти

Перед загрузкой данных или кода в память они должны быть в какой-либо момент связаны с определенными адресами в памяти. Связывание может выполняться на разных этапах:

Связывание во время компиляции (compile-time). Если адрес в памяти априорно известен, компилятором может быть сгенерирован код с абсолютными адресами. При любом изменении размещения программы в памяти должна быть выполнена перекомпиляция. Данный подход более характерен для ранних компьютерных систем с небольшим объемом памяти, либо для обработки и выполнения системных модулей – частей ядра ОС, для которых характерно использование резидентных абсолютных адресов. Для пользовательских программ такой подход неудобен, так как не обеспечивает достаточной гибкости, в частности, возможности без изменений перезагрузить код в другую область памяти.

Связывание во время загрузки (load-time). Загрузка программы в память – стадия ее обработки системой, предшествующая выполнению программы. Чтобы начальный адрес области памяти, куда загружается программа, можно было менять, и это не привело бы к необходимости изменения кода программы, применяется следующий метод. Генерируется перемещаемый код (relocatable code) – код, в котором адресация происходит относительно значения регистра перемещения (relocation register), и адрес в памяти равен сумме значения регистра перемещения и адреса, вычисляемого в команде. Таким образом, при необходимости загрузки кода на другое место в памяти требуется изменить только значение регистра перемещения. Подобный подход широко используется для программ, написанных на традиционных языках программирования.

Связывание во время исполнения (runtime), или динамическое (позднее) связывание. Используется, если процесс во время выполнения может быть перемещен из одного сегмента памяти в другой. Для реализации связывания во время исполнения требуется аппаратная поддержка отображения адресов. В большинстве систем для пользовательских программ используется, главным образом, именно связывание во время исполнения.


Дата добавления: 2018-05-09; просмотров: 452; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!