Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Программный доступ к конфигурационному пространству PCI
Configuration Mechanism #1
Поскольку конфигурационное пространство не имеет привязки к какой-либо определенной области адресного пространства, для доступа к нему применяется специальный механизм, названый в спецификации Configuration Mechanism #1. Для работы этого механизма в пространстве портов I/O зарезервированы два 32-разрядных порта, входящих в главный мост: CONFIG_ADDRESS с адресом 0xCF8 и CONFIG_DATA с адресом 0xCFC. Формат CONFIG_ADDRESS представлен на рис. 2.
Рисунок 2. Формат регистра CONFIG_ADDRESS
Установленный в 1 бит 31 разрешает обращение к конфигурационному пространству через порт CONFIG_DATA, биты 30 – 24 зарезервированы (read-only), при чтении должны возвращать 0, биты 23 – 26 содержат номер шины, биты 15 – 11 – номер устройства, биты 10 – 8 – номер функции и биты 7 – 2 – номер регистра, к которому выполняется обращение (смещение в конфигурационном пространстве).
Порядок работы Configuration Mechanism #1 следующий – в порт CONFIG_ADDRESS (0xCF8) заносится адрес, соответствующий формату, приведенному на рис. 2; обращением к порту CONFIG_DATA (0xCFC) производится чтение или запись данных в требуемый регистр конфигурационного пространства.
PCI BIOS
Для взаимодействия с устройствами PCI имеются дополнительные функции BIOS, доступные как из реального, так и защищенного режима работы процессора. Эти функции предназначены для работы с конфигурационным пространством и генерации специальных циклов PCI.
Функции PCI BIOS для 16-битного реального режима вызываются через прерывание int 0x1A. Номер функции задается в регистре AX. Признаком нормального выполнения являются значения флага CF = 0 и ноль в регистре AH (AH = 0x00, SUCCESFUL). Если CF = 1, то регистр AH содержит код ошибки:
n 0x81 – неподдерживаемая функция (FUNC_NOT_SUP-PORTED);
n 0x83 – неправильный идентификатор производителя (BAD_VENDOR_ID);
n 0x86 – устройство не найдено (DEVICE_NOT_FOUND);
n 0x87 – неправильный номер регистра PCI (BAD_REGIS-TER_NUMBER), т.е. неправильно задано смещение в конфигурационном пространстве.
Перечислим некоторые функции PCI BIOS (полный перечень содержится в [6]):
n 0xB101 – проверка присутствия PCI BIOS;
n 0xB102 – поиск устройства по коду фирмы-изготовителя;
n 0xB103 – поиск устройства по коду класса;
n 0xB108 – чтение байта конфигурационного пространства устройства PCI;
n 0xB109 – чтение слова конфигурационного пространства устройства PCI;
n 0xB10A – чтение двойного слова конфигурационного пространства устройства PCI.
При чтении информации из конфигурационного пространства в регистры процессора заносятся следующие значения:
n AX – номер функции;
n BH – номер шины, к которой подключено устройство (от 0 до 255);
n BL – номер устройства в старших 5 битах и номер функции в трех младших;
n DI – смещение в конфигурационном пространстве.
После этого следует вызов прерывания int 0x1A, в результате которого в регистрах процессора будут размещены следующие значения:
n ECX – считанная информация (байт/слово/двойное слово);
n AH – код возврата (SUCCESFUL/BAD_REGISTER_NUM-BER);
n CF – статус возврата (0 – функция успешно выполнена, 1 – ошибка).
BIOS32
При работе в 32-разрядном защищенном режиме для доступа к функциям PCI BIOS используются средства BIOS32. Процедура проверки наличия BIOS32 предполагает обращение к физическим адресам памяти, поэтому обычно производится из реального режима, до переключения в защищенный. Если BIOS32 поддерживается, то в области памяти BIOS, расположенной в диапазоне 0xE0000 – 0xFFFFF, должна присутствовать специальная 16-байтная структура данных – служебный каталог (BIOS32 Service Directory). Структура каталога приведена в таблице 1.
Таблица 1
Смещение |
Размер, байт |
Назначение |
0x00 |
4 |
Сигнатура служебного каталога в коде ASCII: _32_ |
0x04 |
4 |
32-разрядный физический адрес точки входа в BIOS32 |
0x08 |
1 |
Номер версии реализации BIOS32 (имеет значение 0x00) |
0x09 |
1 |
Размер служебного каталога BIOS32 в 16-байтных параграфах |
0x0A |
1 |
Контрольная сумма |
0x0B |
5 |
Зарезервировано |