к содержанию |
Как мы уже говорили, назначение драйвера 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 и вызвать прерывание INT 2Fh. Если в регистре 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 были подробно описаны во втором томе "Библиотеки системного программиста".
к содержанию |