Главная » Ассемблер, Железо » Вызов функций PCI BIOS в защищенном режиме

0

Когда процессор х86 находится в защищенном режиме, способ вызова функций PCI BIOS зависит от используемого режима адресации.

Если используется 16-разрядная внутрисегментная адресация для кода и данных, то функции PCI BIOS можно вызвать при помощи прерывания Int lAh независимо от того, в каком режиме работает процессор — реальном, защищенном или виртуальном.

Обращение к функциям PCI BIOS может также производиться через специальную точку вызова с физическим адресом 000FFE6Eh, которая имитирует прерывание Int lAh (при работе в защищенном режиме для CS используется база селектора OFOOOh). Обращение по физическому адресу обеспечивает прямой доступ к функциям PCI BIOS, то есть позволяет обойти любые драйверы, которые могут перехватывать прерывание Int lAh.

При работе в 32-разрядном защищенном режиме для доступа к функциям PCI BIOS могут использоваться средства сервиса BIOS32, однако поддержка функций BIOS в 32-разрядном режиме для персональных компьютеров не является обязательной. Процедура проверки наличия такой поддержки предполагает обращение к физическим адресам памяти, поэтому обычно производится из реального режима, до переключения в защищенный режим. Если 32-разряд- ный режим поддерживается, то в области памяти BIOS, расположенной в диапазоне OEOOOOh-OFFFFFh, должна присутствовать специальная 16-байтная структура данных —. Служебный каталог (BIOS32 Service Directory). Структура каталога показана в табл. 3.5.

Таблица 3.5. Структура Служебного каталога PCI BIOS32

Смещение

Размер

Назначение

OOh

4 байта

Сигнатура служебного каталога в коде ASCII: «_32_»

04h

DWORD

32-разрядный физический адрес точки входа BIOS32

08h

BYTE

Номер версии реализации BIOS32 (имеет значение OOh)

09h

BYTE

Размер Служебного каталога BIOS32 в 16-байтных параграфах (имеет значение 01 h)

OAh

BYTE

Контрольная сумма (дополнение суммы байтов 0-9 до нуля)

OBh

5 байт

Зарезервированы, имеют значение 0

Процесс поиска Служебного каталога BIOS32 заключается в сканировании памяти ПЗУ BIOS: производится поиск сигнатуры «_32_» в диапазоне OEOOOOh-OFFFFFh по 16-байтным параграфам (начало Служебного каталога выровнено на границу 16 байт). После

обнаружения сигнатуры производится вычисление и проверка контрольной суммы: если сумма совпадает, то Служебный каталог найден.

Чтобы получить параметры, необходимые для доступа к PCI BIOS в 32-разрядном режиме, требуется выполнить дальний вызов через точку входа BIOS32. Перед выполнением вызова требуется записать в регистры следующую информацию:

•       в ЕАХ — идентификатор запрашиваемого сервиса, который для PCI BIOS имеет значение «$РС1» (049435024И);

•       в ЕВХ — селектор функции, значение которого должно быть равно нулю.

После выполнения вызова в регистре AL будет возвращен код результата (0 — операция успешно завершена, 80h — некорректный идентификатор сервиса, 81h — недопустимое значение селектора функции).

Если вызов завершился успешно, в регистрах процессора будет размещена следующая информация:

•           в ЕВХ — физический адрес базы сервиса BIOS;

•           в ЕСХ — размер сегмента сервиса BIOS;

•       в EDX — точка входа в сервис BIOS (смещение относительно базы, возвращенной в ЕВХ).

Параметры, возвращенные в регистрах ЕВХ, ЕСХ и EDX, можно использовать при выполнении дальнего вызова (физический адрес базы и размер сегмента используются для создания дескрипторов, загружаемых в регистры CS и DS).

ПРИМЕЧАНИЕ

Для программ, использующих функции PCI BIOS, рекомендуется задавать размер стека не менее 1024 байт. При вызове функций в защищенном режиме уровень привилегий должен быть достаточным для того, чтобы подпрограммы имели доступ к пространству ввода-вывода и механизму управления прерываниями.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии