Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Аппаратное обеспечение -> Баула В.Г. -> "Введение в архитектуру ЭВМ и системы программирования" -> 60

Введение в архитектуру ЭВМ и системы программирования - Баула В.Г.

Баула В.Г. Введение в архитектуру ЭВМ и системы программирования — Москва, 2003. — 144 c.
Скачать (прямая ссылка): vvedenievarhetekturuevm2003.pdf
Предыдущая << 1 .. 54 55 56 57 58 59 < 60 > 61 62 63 64 65 66 .. 86 >> Следующая


На рис. 10.5 показан вид ТВИ, ТВА и рабочего поля после загрузки процедуры Beta. 103

ТВИ segment

0 Free-19
2 'A' \0 'B' 'e'
6 ' t' 'a' \0 'C'
10 ' 1' '2 ' \0 'D'
14 'e' 'l' 't' 'a'
18 \0

ТВА segment

Free- 42

2 jmp LoadGo 0FFFFh 2 ( 'A') flags
12 jmp LoadGo 00000h 4 ('Beta') flags
22 jmp LoadGo 0FFFFh 9 ('C12') flags
32 jmp LoadGo 0FFFFh 13 'Delta') flags
І—*" 42

Work segment

00000

30000

Рис. 10.5. Вид ТВИ, ТВА и рабочего поля после загрузки процедуры Beta. Продолжим изучение выполнения нашей модульной программы. Предположим далее, что, проработав некоторое время, процедура Beta вызовет внешнюю процедуру с именем Delta, которая имеет длину 15000 байт. Так как команда call Delta в процедуре Beta при загрузке

call ТВА:32

этой процедуры на рабочее поле заменена динамическим загрузчиком на команду то управление опять получает служебная процедура LoadGo. Она находит процедуру Delta 1 и размещает её на свободном месте рабочего поля (в нашем примере с адреса 30000), затем настраивает внешние адреса в этой процедуре (если они есть) и соответствующие строки в ТВА.

На рис. 10.6 показан вид ТВА и рабочего поля после загрузки и связывания процедуры Delta.

Продолжим наше исследование работы динамического загрузчика. Предположим теперь, что произошёл возврат из процедур Delta и Beta в основную программы, которая после этого вызвала процедуру A длиной в 25000 байт. Процедуры A нет на рабочем поле, поэтому её надо загрузить, однако вызванная процедура LoadGo определяет, что на рабочем поле нет достаточного места для размещения процедуры A. Выход здесь только один - удалить с рабочего поля одну или несколько процедур, чтобы освободить достаточно место для загрузки процедуры A. В нашем случае достаточно, например, удалить с рабочего поля процедуру Beta.

ТВА segment

Free- 42

2 jmp LoadGo 0FFFFh 2 ( 'A') flags
12 jmp LoadGo 00000 4 'Beta') flags
22 jmp LoadGo 0FFFFh 9 ('C12') flags
32 jmp LoadGo 30000 13 'Delta') flags
L-*- 42

Work segment

1 Точнее, как мы уже говорили, ищется объектный модуль, в котором расположена эта процедура. 104

00000

30000 45000

Процедура Beta

Процедура Delta

Рис. 10.6. Вид ТВА и рабочего поля после загрузки процедуры Delta. Итак, служебная процедура LoadGo удаляет с рабочего поля процедуру Beta, загружает на освободившееся место процедуру A и корректирует соответствующим образом строки ТВА. На рис. 10.7 показан вид ТВА и рабочего поля после загрузки процедуры A.

__ТВА segment

Free

2 jmp LoadGo 00000 2 ( 'A') flags
12 jmp LoadGo 0FFFFh 4 ('Beta') flags
22 jmp LoadGo 0FFFFh 9 ('C12') flags
32 jmp LoadGo 30000 13 'Delta') flags
42

Work segment

00000

Процедура A

25000 30000

Процедура Delta

45000

Рис. 10.7. Вид ТВА и рабочего поля после загрузки процедуры A.

Как следует из описания работы динамического загрузчика, на рабочем поле всегда находятся последние из выполняемых процедур, а программа пользователя не должна ни о чём заботиться и работает, как и при статической загрузке модулей, просто обычным образом вызывая необходимые ей внешние процедуры. Часто говорят, что действия динамического загрузчика прозрачны (т.е. невидимы) для программы пользователя.

Иногда, однако, программа пользователя нуждается в некотором управлении динамической загрузкой модулей на рабочее поле. Например, пусть программист знает, что некоторая процедура X будет вызываться часто (в цикле). В этом случае программист может потребовать у динамического загрузчика, чтобы эта процедура X по возможности не удалялась с рабочего поля. Другими словами, динамический загрузчик при нехватке памяти на рабочем поле должен сначала стараться удалить с него другие процедуры, а лишь в последнюю очередь процедуру X. Говорят, что процедура X фиксируется на рабочем поле.

Для фиксации процедуры на рабочем поле в состав динамического загрузчика входит служебная процедура с именем Lock. Программа пользователя должна вызвать эту процедуру с параметром -именем фиксируемой процедуры. На Ассемблере необходимо определить способ передачи этого строкового параметра в служебную процедуру, а на языке Паскаль это можно записать, например, так Lock('X');

Процедура Lock находит в ТВА строку, соответствующую указанной процедуре, и ставит в этой строке признак о том, что она зафиксирована на рабочем поле. Когда необходимость в фиксации процедуры X на рабочем поле отпадёт, программист может расфиксировать эту процедуру, вызвав служебную процедуру динамического загрузчика с именем UnLock. На Паскале это, например, можно сделать так: 105

UnLock('X');

Разумеется, в строке ТВА в поле флагов теперь надо предусмотреть битовый признак Lock/UnLock. Обратите также внимание, что служебные процедуры LoadGo,Lock и UnLock статически связаны с программой пользователя, т.е. расположены в её сегменте кода. Об этом должен позаботиться динамический загрузчик при размещении в оперативной памяти головного модуля программы.
Предыдущая << 1 .. 54 55 56 57 58 59 < 60 > 61 62 63 64 65 66 .. 86 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.