Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Алгоритм работы Непосредственно Связывающего Загрузчика
Наиболее простой алгоритм работы Загрузчика — двухпроходный. На вход Загрузчика обязательно подается список объектных модулей, из которых составляется программа. Этот список может быть параметром программы-Загрузчика или находиться в отдельном файле. На первом проходе Загрузчик просматривает все объектные модули по списку и решает 2 задачи: u определяет общий объем области памяти, необходимый для программы и размещение объектных модулей в этой области; u составляет Глобальную таблицу внешних имен программы. Структура элемента Глобальной таблицы — такая же, как и Таблицы внешних символов каждого модуля. В нее заносятся только входные точки всех модулей. Поскольку Загрузчик уже знает в каком месте области памяти, выделяемой для программы, будет размещаться тот или иной модуль, он заносит в Глобальную таблицу адреса входных точек относительно начала всей программы. В конце 1-го прохода Загрузчик выделяет память и, уже зная фактический начальный адрес программы в памяти корректирует все адреса в Глобальной таблице внешних символов. На 2-м проходе Загрузчик снова читает все объектные модули по списку. При этом он уже размещает коды модуля в памяти и формирует для каждого модуля Таблицу внешних символов (локальную для модуля) и Таблицу перемещений. Адресные поля в этих таблицах он заполняет или корректирует с учетом фактического адреса модуля в памяти и содержимого Глобальной таблицы внешних символов. Затем он выполняет обработку Таблицы перемещений, используя для коррекции адресных кодов в программе значения из Локальной Таблицы внешних символов. Алгоритм выполнения 1-го прохода — следующий:
F Блок1: 1-й проход Загрузчика. F Блок2: Начальные установки. Создание пустой Глобальной таблицы. Стартовый адрес=пусто. Относительный адрес 1-го сегмента — 0. Размер программы — 0. F Блок3: Выборка следующего имени из списка объектных модулей. Если весь список объектных модулей обработан — переход на окончание 1-го прохода. F Блок4: Чтение заголовка очередной записи объектного модуля, если объектный модуль обработан полностью — переход к следующему модулю. F Блок5: Чтение остальной части записи (размер записи содержится в ее заголовке). F Блок6: Разветвление в зависимости от типа записи. F Блок7: При обработке записи окончания проверяется, имеется ли в записи стартовый адрес. Если стартового адреса нет — никакая другая обработка записи не производится. F Блок8: Если в записи есть стартовый адрес, проверяется, не был ли он уже установлен. F Блок9: Если стартовый адрес не был установлен, он устанавливается. F Блок10: Если стартовый адрес был установлен, выдается сообщение об ошибке. (Ни эта, ни последующие рассмотренные ошибки не приводят к немедленному завершению 1-го прохода, однако, если на 1-м проходе были ошибки, 2-й проход не выполняется). F Блок11: При обработке записи связывания выполняется перебор элементов Таблицы внешних символов... F Блок12:...и разветвление — в зависимости от типа элемента. F Блок13: Для элемента — сегмента вычисляется начальный адрес следующего сегмента и длина сегмента прибавляется к общему размеру программы. F Блок14: Для элемента — входной точки ищется имя точки в Глобальной таблице. F Блок15: Если имя не найдено в Глобальной таблице, в таблицу добавляется новый элемент. F Блок16: Если имя найдено в Глобальной таблице, — ошибка, неуникальное внешнее имя. F Блок17: При окончании 1-го прохода проверяется, установился ли адрес стартовой точки программы. F Блок18: Если этот адрес не установлен — ошибка. F Блок19: Если этот адрес установлен и в ходе выполнения 1-го прохода не было других ошибок, Загрузчик продолжает работу. F Блок20: Выделяется память для программы в соответствии с ее размером. F Блок21: В Глобальную таблицу внешних символов записываются фактические адреса. F Блок22: Выполняется 2-й проход. F Блок23: Освобождается Глобальная таблица F Блок24: Если не было ошибок на 2-м проходе F Блок25:...управление передается на стартовый адрес программы F Блок26: Загрузчик завершает работу. Алгоритм выполнения 2-го прохода — следующий:
F Блок1: 2-й проход Загрузчика F Блок2: Установка на начало списка имен объектных модулей. F Блок3: Выборка следующего имени из списка объектных модулей. Если весь список объектных модулей обработан — переход на окончание 2-го прохода. F Блок4: Создание для модуля Локальной таблицы внешних символов и Таблицы перемещений — пустых. F Блок5: Чтение заголовка очередной записи объектного модуля, если все записи модуля прочитаны — переход к обработке перемещений в модуле. F Блок6: Чтение остальной части записи (размер записи содержится в ее заголовке). F Блок7: Разветвление в зависимости от типа записи. F Блок8: Для кодовой записи считывается относительный адрес записи и переводится в фактический. F Блок9: Тело кодовой записи считывается и размещается в памяти по фактическому адресу. F Блок10: Для записи связывания перебираются находящиеся в ней элементы Таблицы имен F Блок11: Обработка разветвляется в зависимости от типа имени. F Блок12: Для имен сегментов или входных точек относительный адрес переводится в фактический. F Блок13: Имя внешней точки ищется в Глобальной таблице внешних имен. F Блок14: Если имя не найдено в Глобальной таблице, выдается сообщение об ошибке. F Блок15: Если имя найдено в Глобальной таблице, в значение адреса из Глобальной таблицы становится значением этого имени. F Блок16: Элемент с откорректированным адресом заносится в Локальную таблицу имен. F Блок17: Для записи перемещения перебираются находящиеся в ней элементы Таблицы перемещения. F Блок18: Относительный адрес в элементе заменяется на фактический... F Блок19:...и элемент добавляется в Таблицу перемещений. F Блок20: После того, как весь модуль прочитан, выполняется перебор Таблицы перемещений модуля. F Блок21: Для каждого элемента Таблицы перемещений имя, записанное в его поле имени ищется в Локальной таблице имен и из Локальной таблицы имен выбирается связанный с этим именем адрес. F Блок22: Из кода программы выбирается код, адрес и длина которого записаны в элементе Таблицы перемещений. F Блок23: Над выбранным кодом и адресом, выбранным из Таблицы имен выполняется операция сложения или вычитания, результат записывается на место кода. F Блок24: После перебора всей Таблицы перемещений, освобождаются Таблица перемещений и Локальная таблица имен модуля, и управление передается на обработку следующего модуля. F Блок25: После обработки всех объектных модулей 2-й проход заканчивается.
Лекция 17. Date: 2015-05-22; view: 647; Нарушение авторских прав |