Assembler - язык неограниченных возможностей


Интерфейс VCPI


Спецификация этого интерфейса была создана в 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 байт, и его надо изменить, прежде чем снова разрешать прерывания
<


Начало  Назад  Вперед