Алгоритм роботи зв’язуючого завантажувача.
Найбільш простим
в реалізації є алгоритм на два перегляди.
На вхід завантажувача обов'язково
подається список об'єктних модулів, з
яких складається програма. При першому
перегляді завантажувач переглядає всі
об'єктні модулі за списком і вирішує 2
задачі:
визначає загальний
обсяг області пам'яті, необхідної для
програми;
складає глобальну
таблицю зовнішніх імен програми.
Структура елемента
глобальної таблиці - така ж, як і таблиці
зовнішніх імен кожного модуля. У неї
заносяться тільки визначення зовнішніх
імен з усіх модулів. Оскільки завантажувач
в процесі перегляду модулів компонує
окремі секції в спільні секції, то він
заносить у глобальну таблицю адреси
імен відносно початку всієї програми.
Наприкінці 1-го
перегляду завантажувач виділяє пам'ять
і, уже знаючи фактичну початкову адресу
програми в пам'яті коректує всі адреси
в глобальній таблиці зовнішніх імен.
На 2-ом перегляді
завантажувач знову читає всі об'єктні
модулі за списком. При цьому він уже
розміщає коди кожного модуля в пам'яті
і формує для кожного модуля окремо
таблицю зовнішніх імен і таблицю
переміщень. Адресні поля в цих таблицях
він коректує з урахуванням фактичної
адреси модуля в пам'яті і вмісту глобальної
таблиці зовнішніх імен. Потім він виконує
опрацювання таблиці переміщень,
використовуючи для корекції адресних
кодів у програмі значення з локальної
таблиці зовнішніх імен.
Алгоритм виконання 1-го перегляду:
|
1-й перегляд
завантажувача.
Початкові
установки. Створення пустої глобальної
таблиці. Стартова адреса = 0. Відносна
адреса 1-го сегменту - 0. Розмір програми
- 0.
Вибірка наступного
об'єктного модуля. Якщо весь список
об'єктних модулів опрацьований -
перехід на закінчення 1-го перегляду.
Читання заголовка
чергового запису об'єктного модуля,
якщо об'єктний модуль опрацьований,
то перехід до наступного модуля.
Читання іншої
частини запису (розмір запису міститься
в її заголовку).
Розгалуження
в залежності від типу запису.
При опрацюванні
кінцевого запису перевіряється, чи
має запис стартову адресу. Якщо ні,
то далі.
Якщо в записі
є стартова адреса, перевіряється, чи
не була вона уже встановленою.
Якщо стартова
адреса не була встановлена, то вона
встановлюється.
Якщо стартова
адреса була встановлена, видається
повідомлення про помилку.
При обробці
запису зв'язування виконується
перебір елементів таблиці зовнішніх
імен...
... і розгалуження
- у залежності від типу елемента.
Для елемента -
сегменту обчислюється початкова
адреса наступного сегмента і довжина
сегмента додається до загального
розміру програми.
Для елемента –
зовнішнього імені здійснюється його
пошук в глобальній таблиці .
Якщо ім'я не
знайдене в глобальній таблиці, у
таблицю додається новий елемент.
Якщо ім'я знайдене
в глобальній таблиці, - помилка,
дублювання імен.
В кінці 1-го
перегляду перевіряється, чи встановлено
стартову адресу програми.
Якщо ця адреса
не встановлена - помилка.
Якщо ця адреса
встановлена й у ході виконання 1-го
перегляду не було інших помилок,
Завантажувач продовжує роботу.
Виділяється
пам'ять для програми відповідно до
її розміру.
У глобальну
таблицю зовнішніх символів записуються
фактичні адреси.
Виконується
2-й перегляд.
Звільняється
глобальна таблиця
Якщо не було
помилок на 2-ом перегляді
... керування
передається на стартову адресу
програми
Завантажувач
завершує роботу.
|