Защищенный режим процессоров Intel

       

Интерфейс HIMEM.SYS


Как мы уже говорили, назначение драйвера HIMEM.SYS и его возможности были подробно описаны во второй части второго тома "Библиотеки системного программиста" (глава 10). Поэтому здесь мы не будем подробно рассматривать эти функции и говорить об их использовании, а приведём только краткий перечень:

Таблица 8. Функции XMS.



00h Получить версию XMS (XMS - eXtended Memory Specification - спецификация расширенной памяти).
01h Запросить управление областью старшей памятью HMA.
02h Освободить область HMA.
03h Глобальное разрешение линии A20.
04h Глобальное запрещение линии A20.
05h Локальное разрешение линии A20.
06h Локальное запрещение линии A20.
07h Определение текущего состояния линии A20.
08h Определение размера свободной расширенной памяти.
09h Получить блок расширенной памяти EMB.
0Ah Освободить блок EMB.
0Bh Копирование блоков расширенной памяти EMB.
0Ch Блокирование блока EMB. Для заблокированного EMB можно определить его физический адрес.
0Dh Разблокирование EMB.
0Eh Получить информацию об индексе EMB.
0Fh Изменить размер блока EMB.
10h Запросить управление областью UMB.
11h Освободить область UMB.

Для проверки наличия в системе драйвера, поддерживающего спецификацию XMS, необходимо загрузить в регистр AX значение 4300h и вызвать прерывание INT2Fh. Если в регистре AL окажется значение 80h, драйвер установлен. В этом случае можно получить адрес управляющей программы, которую надо вызывать для выполнения функций. Если загрузить в регистр AX значение 4310h и вызвать прерывание INT 2Fh, в регистрах ES:BX будет записан искомый адрес.

Как можно заметить, функции XMS позволяют управлять линией A20 и копировать блоки расширенной памяти. Но вы не найдёте среди них функции для перехода в защищённый режим!

И это не случайно. Всё дело в том, что для работы с расширенной памятью драйвер HIMEM.SYS, реализующий спецификацию XMS, не использует защищённый режим работы процесора!

Как это может быть? Ведь процессор, находясь в реальном режиме не может адресовать память за границей первого мегабайта.


Секрет заключается в том, что для процессора i80286 драйвер HIMEM.SYS использует недокументированную машинную команду LOADALL. Эта команда предназначена для тестирования процессора и не приведена в документации на процессор i80286 (см. описание команды LOADALL в приложении).

С помощью этой команды можно выполнить загрузку всех регистров процессора, в том числе и некоторых недоступных программам. Используя нестандартную загрузку регистров, драйвер HIMEM.SYS может адресовать расширенную память, находясь в реальном режиме.

Такой способ адресации расширенной памяти значительно ускоряет процесс копирования по сравнению с использованием функции 87h прерывания INT 15h. Кроме того, во время копирования функцией 0Bh драйвера HIMEM.SYS прерывания остаются разрешёнными.

Процессор i80386 тоже имеет недокументированную команду LOADALL, которая отличается от имеющейся в процессоре i80286 и кодом, и выполняемыми действиями. Однако процессор i80386 способен адресовать расширенную память, находясь в реальном режиме (при соответствующей загрузке системных регистров, которая может быть выполнена с использованием только документированных команд).

В том, что на уровне интерфейса HIMEM.SYS не используется защищённый режим, заключена ещё одна причина, по которой мы не стали подробно рассматривать этот интерфейс в книге, посвящённой защищённому режиму.

Использование интерфейса HIMEM.SYS оправдано в тех случаях, когда для работы вашей программы требуется буфер памяти большого размера, который может быть размещён только в расширенной памяти. Однако программа не сможет непосредственно адресовать этот буфер и вынуждена выполнять операцию копирования данных из стандартной памяти в расширенную и обратно, что ведёт к непроизводительной потере времени.

В приложении описана утилита MEMOSCOP. Эта утилита выводит на экран список установленных в системе драйверов дополнительной памяти и доступных интерфейсов с защищённым режимом. В файле xmmc.asm находятся функции для работы с интерфейсом XMS.Этот файл и сами функции XMS были подробно описаны во втором томе "Библиотеки системного программиста".


Содержание раздела