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 байт, и его надо изменить, прежде чем снова разрешать прерывания
<
/p> Точка входа VCPI, АХ = DE0Ch — Переключиться в режим V86 (для вызова из РМ)

Ввод: Перед передачей управления командой call в стек надо поместить регистры в следующем порядке (все значения — двойные слова): GS, FS, DS, ES, SS, ESP, 0, CS, EIP. Прерывания должны быть запрещены
Вывод: Сегментные регистры загружаются, значение ЕАХ не определено, прерывания запрещены
Остальные функции VCPI:

INT 67h AX = DE02h — Определить максимальный физический адрес

Ввод: АХ = 0DE02h
Вывод: АН = 0, если нет ошибок
EDX = физический адрес самой старшей 4-килобайтной страницы, которую можно выделить
INT 67h AX = DE03h — Определить число свободных страниц

Ввод: АХ = 0DE03h
Вывод: АН = 0, если нет ошибок
EDX = число свободных 4-килобайтных страниц для всех задач
INT 67h AX = DE04h — Выделить 4-килобайтную страницу (обязательно надо вызвать DE05h)

Ввод: АХ = 0DE04h
Вывод: АН = 0, если нет ошибок
EDX = физический адрес выделенной страницы
INT 67h AX = DE05h — Освободить 4-килобайтную страницу

Ввод: АХ = 0DE05h
EDX = физический адрес страницы
Вывод: АН = 0, если нет ошибок
INT 67h AX = DE06h — Определить физический адрес 4-килобайтной страницы в первом мегабайте

Ввод: АХ = 0DE06h
СХ = линейный адрес страницы, сдвинутый вправо на 12 бит
Вывод: АН = 0, если нет ошибок
EDX = физический адрес страницы
INT 67h AX = DE07h — Прочитать регистр CR0

Ввод: АХ = 0DE07h
Вывод: АН = 0, если нет ошибок
ЕВХ = содержимое регистра CR0
INT 67h АХ = DE08h — Прочитать регистры DR0 – DR7

Ввод: АХ = 0DE08h
ES:DI = буфер на 8 двойных слов
Вывод: АН = 0, если нет ошибок, в буфер не записываются DR4 и DR5
INT 67h AX = DE09h — Записать регистры DR0 – DR7

Ввод: АХ = 0DE09h
ES:DI = буфер на 8 двойных слов с новыми значениями для регистров
Вывод: АН = 0, если нет ошибок (DR4 и DR5 не записываются)
<


/p> INT 67h AX = DE0Ah — Определить отображение аппаратных прерываний

Ввод: АХ = 0DE0Ah
Вывод: АН = 0, если нет ошибок
ВХ = номер обработчика для IRQ0
СХ = номер обработчика для IRQ8
INT 67h AX = DE0Bh — Сообщить VCPI- серверу новое отображение аппаратных прерываний (вызывается после перепрограммирования контроллера прерываний)

Ввод: АХ = 0DE0Bh
ВХ = номер обработчика для IRQ0
СХ = номер обработчика для IRQ8
Вывод: АН = 0, если нет ошибок
Итак, чтобы использовать защищенный режим с VCPI, фактически надо уметь программировать его самостоятельно. Например, чтобы вызвать прерывание DOS или BIOS, нам пришлось бы переключаться в режим V86, вызывать прерывание и затем возвращаться обратно. Естественно, этот интерфейс не получил широкого развития и был практически повсеместно вытеснен более удобным DPMI.


Содержание раздела