|
|
|
|
Специальный случай: библиотеки исполняющей системы (RTL) с неполным временем работы
Одной из многих возможностей, которые могут быть реализованы с представленными функциями, является неполное время работы библиотеки исполняющей
системы (RTL). Программы неполного времени работы RTL являются резидентными только тогда, когда это необходимо, а остальное время располагаются на
диске. Эта возможность реализуется путем установки части заголовков RTL точно также, как описывалось в этой главе. Однако, эти заголовки не содержат
программных кодов для выполнения функций библиотеки; т.е. они не содержат подпрограммы своей библиотеки, которые остались на диске в другом файле.
Последовательность событий, происходящих при выполнении программ неполного времени работы RTL, показана в блок-схеме 3-1.
____________________
| Загрузка |
| заголовков |
|____________________|
|
.--------------->|<---------------------------.
| __________V_________ |
| | | |
| | Прием запроса | |
| |____________________| |
| | |
| | |
| / \ |
| /Ко-\ |
| /манда\ __________|__________
| /освобо-\ ДА | Освобождение распре-|
| | ждения |----------->| деленной памяти |
| \памяти / |_____________________|
| \RTL ?/
| \ /
| \ /
| НЕТ |
| V
| / \
| / \
| / \ ____________________
| / RTL \ НЕТ |Распределение памяти|
| |установ- |------------>| для загрузки RTL |
| \ лена ?/ |____________________|
| \ / |
| \ / |
| \ / |
| | |
| ДА |<----------------------------
| __________V_________
| | |
-----| Функция выполнения |
|____________________|
Блок-схема 3-1. Последовательность загрузки RTL с неполным
временем работы
|
Когда одна из подпрограмм библиотеки доступна (через прерывание), то часть заголовков подпрограмм загружает файл библиотеки в память, используя
функцию 4Bh (AL=3) "Загрузить оверлей" и "запирает" его в своей собственной памяти. Затем вызывается требуемая подпрограмма библиотеки для выполнения
запрашиваемой функции. Либо часть заголовков, либо конкретные подпрограммы библиотеки могут содержать инструкцию IRET для возврата в вызывающую
программу. С этого момента библиотеке доступен вызов всей последовательности без ожидания времени на загрузку, поскольку RTL осталась резидентной в
памяти.
Когда главная программа завершается или требует пространство памяти RTL, она передает в точку входа RTL код для освобождения памяти,
распределенной для RTL. Поскольку часть заголовков знает адрес загрузки подпрограмм библиотеки после их загрузки, и поскольку их блоком памяти
владеет часть заголовков, освобождение памяти не вызывает проблем. После этого выполняется перевод части заголовков обратно в положение "спячки" для
ожидания последующего вызова.
|
|