Гук Михаил Юрьевич
Шрифт:
• AX = B106h – генерация специального цикла PCI. При вызове в BL указывается номер шины, в EDX – данные специального цикла.
• AX = B108h – чтение байта из конфигурационного пространства устройства PCI. При вызове в BH – номер шины, в BL[7:3] – номер устройства, BL[2:0] – номер функции, в DI – номер регистра (0–FFh). При успешном возврате в CL – считанный байт.
• AX = B109h – чтение слова из конфигурационного пространства устройства PCI.
При вызове в BH – номер шины, в BL[7:3] – номер устройства, BL[2:0] – номер функции, в DI – номер регистра (0–FFh, четный). При успешном возврате в CX – считанное слово.
• AX = B10Ah – чтение двойного слова из конфигурационного пространства устройства PCI. При вызове в BH – номер шины, в BL[7:3] – номер устройства, BL[2:0] – номер функции, в DI – номер регистра (0–FFh, кратный 4). При успешном возврате в ECX – считанное двойное слово.
• AX = B10Bh – запись байта в конфигурационное пространство устройства PCI.
При вызове в BH – номер шины, в BL[7:3] – номер устройства, BL[2:0] – номер функции, в DI – номер регистра (0–FFh), в CL – записываемый байт.
• AX = B1 °Ch – запись слова в конфигурационное пространство устройства PCI.
При вызове в BH – номер шины, в BL[7:3] – номер устройства, BL[2:0] – номер функции, в DI – номер регистра (0–FFh, четный), в CX – записываемое слово.
• AX = B10Dh – запись двойного слова в конфигурационное пространство устройства PCI. При вызове в BH – номер шины, в BL[7:3] – номер устройства, BL[2:0]—номер функции, в DI – номер регистра (0–FFh, кратный 4), в ECX – записываемое двойное слово.
• AX = B10Eh – определение возможностей назначения прерываний (GET_IRQ_ROUTING_OPTIONS). При вызове BX=0, ES: EDI указывает на структуру параметров буфера для результата, состоящую из слова с длиной буфера, за которым располагается дальний указатель на его начало. DS в 16$разрядом режиме указывает на сегмент с физическим адресом F0000, в 32$разрядном определяется правилами из следующего раздела. При успешном возврате в BX находится битовая карта запросов IRQx, в которой единичное значение бита означает, что данный вход контроллера прерываний используется исключительно шиной PCI.
В буфер помещается последовательный набор структур, описывающих возможности и назначение прерываний для каждого устройства PCI (табл. 5.2). При возврате в структуре параметров буфера возвращается его реальная длина; если при вызове указан буфер, не вмещающий весь результат, устанавливается код ошибки 89h.
• AX = B10Fh – назначение линий запроса прерываний (SET_PCI_IRQ). При вызове в BH задается номер шины, в BL – номер устройства (биты [7:3]) и функции (биты [2:0]), для которой назначается запрос; в CL указывается вывод (0Ah – INTA#,… 0Dh – INTD#), в CH – желаемый номер IRQx (0…0Fh, причем 0 соответствует отключению INTx# от входов контроллера). Значение DS аналогично предыдущей функции. Если заказанное назначение невозможно, при возврате устанавливается код ошибки 88h. При использовании данной функции следует выполнять и сопутствующие изменения в конфигурационных регистров всех затрагиваемых устройств и их функций (см. главу 3).
Поиск 32-разрядных сервисов BIOS
32-разрядные сервисы BIOS32 ищутся через каталог 32-разрядных сервисов.[14] Адрес точки входа в каталог сервисов заранее не известен, но известен способ его нахождения: в диапазоне адресов памяти 0E0000-0FFFFFh в началах параграфов (младшие 4 бита адреса нулевые) ищется строка-сигнатура «32» заголовка (число 325F5F33h), за которой следует 32-разрядный физический адрес точки входа в каталог. Точки входа в сами сервисы ищутся через каталог сервисов. Номер, параметры вызываемых функций и результаты передаются на регистрах процессора.
Для поиска сервиса в каталоге 4-байтная строка-идентификатор сервиса заносятся в регистр EAX, в EBX заносится 0 (код функции поиска в каталоге) и выполняется дальний вызов (CALL FAR) по адресу точки входа в каталог. Результат поиска передается на регистрах: AL = 00h – сервис найден, при этом в EBX – базовый Смотри документ «Standard BIOS 32-bit Service Directory*. адрес сервиса, в ECX – его длина (определяет длину сегмента), EDX – смещение точки входа от начала сервиса (от EBX). Если AL = 81h – сервис не найден.
До попытки использования каталога сервисов следует убедиться в корректности заголовка, проверив его контрольную сумму: накопленная сумма всех байтов заголовка должна быть нулевой. Длина заголовка (в параграфах) указана в байте со смещением 9, в байте 8 – номер ревизии заголовка. Проверка контрольной суммы обязательна, поскольку 4-байтная сигнатура может совпасть с фрагментом программного кода BIOS (строка 32 дизассемблируется как POP DI; XOR SI,[BP + SI]). 32-разрядные сервисы вызываются дальними вызовами (CALL FAR), при этом сегмент кода CS должен иметь базу в начале 4-килобайтной страницы, в которую попадает точка входа, а лимит должен позволять охватывать эту и следующую страницу.[15] Сегмент DS должен иметь такую же базу и не меньший лимит. Напомним, что здесь идет речь о физических адресах (после страничного преобразования линейных).
Expansion ROM карт PCI
В микросхеме ROM BIOS, установленной на системной плате, поддерживаются только стандартные (по назначению и реализации) устройства. При необходимости дополнительные устройства, устанавливаемые в слоты шин расширения (ISA, PCI, PCMCIA), могут иметь микросхемы ПЗУ своей программной поддержки – Additional ROM BIOS (дополнительные модули ROM BIOS), они же Expansion ROM. Эта необходимость возникает, когда программная поддержка устройств требуется до загрузки ОС и прикладного ПО. Роль Expansion ROM может и не ограничиваться поддержкой данного устройства – в таком модуле может содержаться и вся программа функционирования специализированного бездискового контроллера на базе PC. Расширения ROM BIOS используют графические адаптеры EGA/VGA/ SVGA, некоторые контроллеры жестких дисков, контроллеры SCSI, сетевые адаптеры с удаленной загрузкой и другие периферийные устройства. Для модулей расширения устройств с шиной ISA в пространстве памяти зарезервирована область C8000h-F4000h. POST сканирует эту область с шагом 2 Кбайт в поисках дополнительных модулей BIOS на завершающем этапе выполнения (после загрузки векторов прерываний указателями на собственные обработчики). Дополнительный модуль BIOS графического адаптера (EGA, VGA, SVGA) имеет фиксированный адрес C0000 и инициализируется раньше (на шаге инициализации видеоадаптера). Устройства с шиной PCI в своем конфигурационном пространстве содержат лишь признак использования модуля расширения, а его приписку к адресам памяти назначает POST.