6.2. Интерфейс VCPI

Спецификация интерфейса VCPI была создана в 1989 году (вскоре после по­явления процессора 80386) компаниями Phar Lap Software и Quaterdeck Office Systems. Программа, применяющая VCPI для переключения в защищенный ре­жим, должна поддерживать полный набор системных таблиц - GDT, LDT, IDT, таблицы страниц и т. д. То есть фактически VCPI-сервер обеспечивает следующее: процессор находится в защищенном режиме, и различные программы, пользую­щиеся им, не конфликтуют между собой.

VCPI является своего рода расширением интерфейса EMS, и все обращения к нему выполняются при помощи прерывания EMS, INT 67h с АН = ODEh и ко­дом подфункции VCPI в AL.

INT 67h АХ =0DE00h: Проверка наличия VCPI Вход:   АХ = ODEOOh Выход: АН = 00, если VCPI есть

ВН, BL - версия (старшая, младшая цифры)

' в РМ

INT б7к AX = Получить точку входа VCPI

Вход: AX=ODEOIh

ES:DI - адрес 4-килобайтного буфера для таблицы страниц DS:SI = адрес таблицы дескрипторов

Выход: АН = 0, если нет ошибок

DS:SI: первые три дескриптора заполняются дескрипторами VCPI-сервера ES:DI: адрес первой не используемой сервером записи в таблице страниц ЕВХ: адрес точки входа VCPI относительно сегмента, дескриптор кото­. рого лежит первым в таблице DS:SI. Можно делать far call из 32-битно­го защищенного режима на этот адрес с АХ = ODEOOh - 0DE05h, чтобы пользоваться функциями VCPI из защищенного' режима

INT б7к AX = ODEOCk: VCPI: переключиться в защищенный режим (для вызова

из V86)

Вход: АХ - ODEOCh

ESI = линейный адрес таблицы со значениями для системных регист­ров (в первом мегабайте) +QQh: 4 байта - новое значение CR3

+04h: 4 байта - адрес б-байтного значения для GDTR +08h: 4 байта - адрес б-байтного значения для IDTR +OCh: 2 байта - LDTR +0Eh: 2 байта - TR

+10h: 6 байт - CS:EIP - адрес точки входа прерывания должны быть запрещены Выход: Загружаются регистры GDTR, IDTR, LDTR, TR. Теряются регистры ЕАХ, ESI, DS, ES, FS, GS. SS:ESP указывает на стек размером 16 байт, и его надо изменить, прежде чем снова разрешать прерывания

Точка входа VCPI, АХ = ODEOCh: Переключиться в режим V86 (для вызова из РМ) Вход: Перед передачей управления командой call в стек надо поместить реги­стры в следующем порядке (все значения - двойные слова): GS, FS, DS,

ES, SS, ESP, О, CS, EIP. Прерывания должны быть запрещены

Выход: Сегментные регистры загружаются, значение ЕАХ не определено, пре­рывания запрещены

Остальные функции VCPI:

INT67kAX = 0DE02h: Определить максимальный физический адрес

Вход: AX = ODEQ2h

Выход: АН = Q, если нет ошибок

EDX = физический адрес самой старшей 4-килобайтной страницы, ко­торую можно выделить

INT67hAX = 0DE03h: Определить число свободных страниц

Вход: АХ = ODEQ3h

Выход: АН = 0, если нет ошибок

EDX = число свободных 4-килобайтных страниц для всех задач

Интерфейс УСРІ

ііаямії

ІЖ67кЛХ = 0ВЕ04к Выделить 4-килобайтную страницу (обязательно надо выз­вать БЕ05п)

Вход: АХ = (ЮЕ04гі

Выход: АН = 0, если нет ошибок

ЕБХ = физический адрес выделенной страницы

ШТ67ПАХ= 0БЕ05к Освободить 4-килобайтную страницу Вход:  АХ = <ЮЕ05п

ЕБХ = физический адрес страницы Выход: АН = 6, если нет ошибок

1ЫГ 67к ЛХ =0ПЕ06к Определить физический адрес 4-килобайтной страницы в первом мегабайте Вход: АХ = ОБЕОбЬ

СХ = Линейный адрес страницы, сдвинутый вправо на 12 бит Выход: АН - 0, если нет ошибок

ЕВХ = физический адрес страницы

1ЫГ67пЛХ =0ВЕ07к Прочитать регистр СЯО Вход:  АХ = ООЕ07гі Выход: АН - 0, если нет ошибок

ЕВХ = содержимое регистра СЯО

1ЫТ67кАХ = 0БЕ08к Прочитать регистры ОЯО -Вход:  АХ = 0ЭЕ08Ь

ЕБ:БІ = буфер на 8 двойных слов Выход: АН = 0, если нет ошибок, в буфер не записываются БЯ4 и БЯ5

Ш'67пАХ- ОВЕОЭк. Записать регистры БЯО - ОЯ7 Вход:  АХ = ОБЕ09Ь

ЕБ:БІ = буфер на 8 двойных слов с новыми значениями для регистров Выход: АН = 0, если нет ошибок (БЯ4 и БЯ5 не записываются)

1ЫГ 67к ЛХ = ОБЕОЛк: Определить отображение аппаратных прерываний Вход: АХ = ООЕОАЬ

Выход: АН = 0, если нет ошибок

ВХ = номер обработчика для ЖдО СХ = номер обработчика для 1110,8

1ЫГ67кЛХ = ОБЕОВк: Сообщить УСРІ-серверу новое отображение аппаратных

прерываний (вызывается после перепрограммирования контроллера прерываний)

Вход: АХ=ООЕОВЬ

ВХ - номер обработчика для ЖО^О СХ = номер обработчика для ІЯО8

Выход: АН = 0, если нет ошибок

Итак, чтобы использовать защищенный режим с УСРІ, фактически надо уметь программировать его самостоятельно. Например, чтобы вызвать прерывание БОБ или BIOS, нам пришлось бы переключаться в режим V86, вызывать прерывание и затем возвращаться обратно. Естественно, этот интерфейс не получил широко­го развития и был практически повсеместно вытеснен более удобным DPMI.