Спецификация этого интерфейса была создана в 1989 году, вскоре после появления процессора 80386, компаниями Phar Lap Software и Quaterdeck Office Systems. Программа, пользующаяся VCPI для переключения в защищенный режим, должна поддерживать полный набор системных таблиц — GDT, LDT, IDT, таблицы страниц и т.д., то есть фактически VCPI-сервер обеспечивает следующее — процессор находится в защищенном режиме, и различные программы, пользующиеся им, не будут конфликтовать между собой.
VCPI является своего рода расширением интерфейса EMS, и все обращения к нему выполняются при помощи прерывания EMS, INT 67h с АН = 0DEh и кодом подфункции VCPI в AL.
INT 67h АХ = DE00h — Проверка наличия VCPI
Ввод: | AX = 0DE00h |
Вывод: | АН = 00, если VCPI есть ВН, BL — версия (старшая, младшая цифры) |
INT 67h АХ = DE01h — Получить точку входа VCPI
Ввод: | AX = 0DE01h ES:DI = адрес 4-килобайтного буфера для таблицы страницDS:SI = адрес таблицы дескрипторов |
Вывод: | АН = 0, если нет ошибок DS:SI — первые три дескриптора заполняются дескрипторами VCPI-сервера ES:SI — адрес первой не используемой сервером записи в таблице страниц ЕВХ — адрес точки входа VCPI относительно сегмента, дескриптор которого лежит первым в таблице DS:SI. Можно делать far call из 32-битного защищенного режима на этот адрес с АХ = DE00h – DE05h, чтобы пользоваться функциями VCPI из защищенного режима |
INT 67h AX = DE0Ch — VCPI: переключиться в защищенный режим (для вызова из V86)
Ввод: | AX = 0DE0Ch ESI = линейный адрес таблицы со значениями для системных регистров (в первом мегабайте) +00h: 4 байта — новое значение CR3 +04h: 4 байта — адрес 6-байтного значения для GDTR +08h: 4 байта — адрес 6-байтного значения для IDTR +0Ch: 2 байта — LDTR +0Eh: 2 байта — TR +10h: 6 байт — CS:EIP — адрес точки входа прерывания должны быть запрещены |
Вывод: | Загружаются регистры GDTR, IDTR, LDTR, TR. Теряются регистры ЕАХ, ESI, DS, ES, FS, GS. SS:ESP указывает на стек размером в 16 байт, и его надо изменить, прежде чем снова разрешать прерывания |
Ввод: | Перед передачей управления командой call в стек надо поместить регистры в следующем порядке (все значения — двойные слова): GS, FS, DS, ES, SS, ESP, 0, CS, EIP. Прерывания должны быть запрещены |
Вывод: | Сегментные регистры загружаются, значение ЕАХ не определено, прерывания запрещены |
Ввод: | АХ = 0DE02h |
Вывод: | АН = 0, если нет ошибок EDX = физический адрес самой старшей 4-килобайтной страницы, которую можно выделить |
Ввод: | АХ = 0DE03h |
Вывод: | АН = 0, если нет ошибок EDX = число свободных 4-килобайтных страниц для всех задач |
Ввод: | АХ = 0DE04h |
Вывод: | АН = 0, если нет ошибок EDX = физический адрес выделенной страницы |
Ввод: | АХ = 0DE05h EDX = физический адрес страницы |
Вывод: | АН = 0, если нет ошибок |
Ввод: | АХ = 0DE06h СХ = линейный адрес страницы, сдвинутый вправо на 12 бит |
Вывод: | АН = 0, если нет ошибок EDX = физический адрес страницы |
Ввод: | АХ = 0DE07h |
Вывод: | АН = 0, если нет ошибок ЕВХ = содержимое регистра CR0 |
Ввод: | АХ = 0DE08h ES:DI = буфер на 8 двойных слов |
Вывод: | АН = 0, если нет ошибок, в буфер не записываются DR4 и DR5 |
Ввод: | АХ = 0DE09h ES:DI = буфер на 8 двойных слов с новыми значениями для регистров |
Вывод: | АН = 0, если нет ошибок (DR4 и DR5 не записываются) |
Ввод: | АХ = 0DE0Ah |
Вывод: | АН = 0, если нет ошибок ВХ = номер обработчика для IRQ0 СХ = номер обработчика для IRQ8 |
Ввод: | АХ = 0DE0Bh ВХ = номер обработчика для IRQ0 СХ = номер обработчика для IRQ8 |
Вывод: | АН = 0, если нет ошибок |