Интерфейс 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, не использует защищённый режим работы процесора!
Как это может быть? Ведь процессор, находясь в реальном режиме не может адресовать память за границей первого мегабайта.