|
И, наоборот, эффективность может
сильно возрасти, если все резидентные подпрограммы будут содер-
жать блок заголовка, показанный в листинге 3-7, и который уни-
кально идентифицирует каждую резидентную подпрограмму.
Второй способ проверки наличия RTL или резидентной подпрог-
раммы в памяти, требует, чтобы все неиспользуемые векторы преры-
вания (в больших системах от вектора 40h до вектора 0FFh) были
установлены в известное состояние. Это состояние может быть либо
верхней, либо нижней памятью (0000:0000 или FFFF:FFFF), или адре-
сом инструкции IRET. |
файловый менеджер |
|
|
В MS-DOS версии 2.0 и выше вектор 28h всегда
указывает на ячейку инструкции IRET, хотя это не гарантируется!
Более элегантным решением для обработки незапрошенных прерыва-
ний и инициализации всех неиспользуемых векторов прерываний для
указания на эту подпрограмму (смотри главу 6 "Устанавливаемые
драйверы устройств") является установка драйвера псевдо-устройс-
тва. Этот драйвер может затем содержать инструкцию IRET, отчет об
ошибках, выдаваемый на консоль, или все, что потребуется. |
avast 4 |
|
|
При
постоянном распределении одного вектора для постоянного указания
на драйвер незапрошенных прерываний (например, вектор 40h) прог-
рамма установки может прочитать и сравнить этот вектор и вектор
резидентной подпрограммы, чтобы убедиться в том, была ли уже ре-
зидентная программа установлена в памяти.
Листинг 3-7. Идентификация входных строк подпрограммы
----------------------------------------------------------------
enter: jmp start ; обход области данных
db '<имя подпрограммы>' ; здесь задается имя подпр-мы
... |
norton antivirus |
|
|
системы резервного копирования, symantec, перевод с русского на английский, panda antivirus, антивирус panda, .
asplinux 11
|
3-12. Доступ к библиотеке исполняющей системы (RTL)
Как определить, установлены ли резидентные программы?
До сих пор мы предполагали, что библиотека исполняющей систе-
мы (RTL) должна быть загружена в память, и только после этого
должны стартовать программы, которые ее используют. При некоторых
обстоятельствах RTL может всегда находиться в памяти. Чем загру-
жать повторную копию RTL, загрузчик сначала должен определить
загружена ли уже RTL в память, и загружать ее только тогда, если
она отсутствует в памяти. Имеется два способа определения наличия
RTL в памяти, которые оба зависят от использования предварительно
назначенного вектора прерывания для доступа к RTL.
Первый способ - чтение содержимого вектора прерывания по-
средством функции с кодом 35h "Получить вектор прерывания" для
определения начального адреса подпрограммы обслуживания прерыва-
ния (ISR - Interrupt service routine). Следующий шаг состоит в
том, чтобы поместить в регистры DS и SI начальный адрес устанав-
ливаемой существующей подпрограммы. Затем выполняется инструкция
CMPS (сравнение строк) для сравнения некоторого количества бай-
тов (в регистре CS) двух секций программы. Если результат сравне-
ния положительный, то подпрограмма уже представлена в памяти. Ес-
ли сравнение не произошло, то подпрограмма не была установлена в
памяти. Эффективность этого способа намного упадет, если все RTL
(или резидентные подпрограммы) будут начинаться с одинаковой по-
следовательности инструкций.
|
|
|