link700 link701 link702 link703 link704 link705 link706 link707 link708 link709 link710 link711 link712 link713 link714 link715 link716 link717 link718 link719 link720 link721 link722 link723 link724 link725 link726 link727 link728 link729 link730 link731 link732 link733 link734 link735 link736 link737 link738 link739 link740 link741 link742 link743 link744 link745 link746 link747 link748 link749 link750 link751 link752 link753 link754 link755 link756 link757 link758 link759 link760 link761 link762 link763 link764 link765 link766 link767 link768 link769 link770 link771 link772 link773 link774 link775 link776 link777 link778 link779 link780 link781 link782 link783 link784 link785 link786 link787 link788 link789 link790 link791 link792 link793 link794 link795 link796 link797 link798 link799 link800 link801 link802 link803 link804 link805 link806 link807 link808 link809 link810 link811 link812 link813 link814 link815 link816 link817 link818 link819 link820 link821 link822 link823 link824 link825 link826 link827 link828 link829 link830 link831 link832 link833 link834 link835 link836 link837 link838 link839

PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

PCI и PCI-X

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 Kбайт в поисках дополнительных модулей BIOS на завершающем этапе выполнения (после загрузки векторов прерываний указателями на собственные обработчики). Дополнительный модуль BIOS графического адаптера (EGA, VGA, SVGA) имеет фиксированный адрес C0000 и инициализируется раньше (на шаге инициализации видеоадаптера). Устройства с шиной PCI в своем конфигурационном пространстве содержат лишь признак использования модуля расширения, а его приписку к адресам памяти назначает POST.

Дополнительный модуль ROM BIOS должен иметь заголовок, выровненный по границе 2-килобайтной страницы памяти, формат заголовка ПЗУ иллюстрирует таблица.

Смещение Длина Назначение
0 2 Сигнатура (признак начала модуля): байт 0=55h, байт 1=AAh
2 1 Длина, указанная в блоках по 512 байт
3 3 Точка входа процедуры инициализации, заканчивающейся дальним возвратом Ret Far (вызывается инструкцией Far Call во время POST). Обычно здесь располагается 3-байтная инструкция JMP, указывающая на начало процедуры
6-17h
 
Резерв
18h 2 Указатель на структуру данных PCI (только для карт PCI)
1Ah 2 Указатель на структуру расширенного заголовка карт ISA PnP

Таблица. Заголовок модуля дополнительного ПЗУ

В традиционном заголовке присутствовали только первые три поля, указатели на структуры PCI и ISA PnP ввели позже. Корректным считается модуль, начинающийся с признака AA55h (значения 16-битного слова с учетом порядка байтов) и нулевой суммой (по модулю 256) всех байтов в объявленной области (реальная длина модуля может превышать объявленную, но байт контрольной суммы, естественно, должен входить в объявленную область).

В случае обнаружения корректного модуля POST дальним вызовом (Call Far) вызывает процедуру инициализации модуля, начинающуюся с 3-го адреса заголовка модуля. Ответственность за ее корректность полностью ложится на разработчика. Процедура может переопределять векторы прерываний, обслуживаемых BIOS. Переопределив на себя вектор Bootstrap (Int 19h), можно получить управление при загрузке, что и используется, например, для удаленной загрузки компьютеров через локальную сеть (Remote Boot Reset). Если стандартное продолжение процедуры загрузки не требуется, а дополнительный модуль представляет собой, например, управляющую программу для какого-либо оборудования, вместо процедуры инициализации в ПЗУ может находиться и основная программа, не возвращающая управление системной последовательности POST, которая бы выполнила обычную загрузку.

Процедура инициализации и программная поддержка устройства в ПЗУ должны быть написаны таким образом, чтобы им были безразличны абсолютные адреса, по которым они размещаются в пространстве памяти. На картах расширения, как правило, имеются средства изменения базового адреса, а иногда и размера ПЗУ (джамперы или программно-управляемые переключатели). Это позволяет бесконфликтно разместить модули ПЗУ нескольких установленных карт.

Для содержимого ПЗУ расширения BIOS, установленных на картах PCI, принят стандарт, несколько отличающийся от традиционных дополнительных модулей ROM BIOS. Заголовок ПЗУ соответствует традиционному, но дополнительно имеет указатель на структуру данных PCI (см. следующую таблицу). Идентификаторы производителя и устройства, а также код класса совпадают с описанными в конфигурационном пространстве устройства PCI. Поскольку шина PCI используется не только в PC, в ПЗУ карты может храниться несколько программных модулей. Каждый модуль начинается со структуры данных, сам модуль следует сразу за структурой. За ним начинается структура для следующего модуля (если у предыдущего не установлен признак последнего модуля) и т. д. Тип платформы (процессора) указывается в заголовке модуля и при инициализации BIOS активизируется только нужный. Такой механизм позволяет, например, один и тот же графический адаптер устанавливать и в IBM PC, и в Power PC.

 

Смещение Длина, байт Назначение
0 4 Сигнатура, строка символов «PCIR»
4 2 Идентификатор производителя
6 2 Идентификатор устройства
8 2 Резерв
Ah 2 Длина структуры (в байтах), начиная с сигнатуры
Ch 1 Версия структуры (0 для данной версии)
Dh 3 Код класса
10h 2 Длина рабочего образа
12h 2 Версия кода/данных
14h 1 Тип кода: 0 — x86 для PC-AT, 2 — HP PA-RISC
15h 1 Индикатор: 1 — последний образ, 0 — не последний
16h 2 Резерв

Таблица. Структура данных PCI

Применительно к дополнительному ПЗУ карты PCI имеется три параметра, относящихся к размерам областей памяти. Размер ПЗУ определяется чтением конфигурационного пространства. Размер, указанный в байте 2 заголовка, указывает на длину модуля на этапе инициализации. Этот модуль POST загружает в ОЗУ перед тем, как вызвать процедуру инициализации (точка входа со смещением 3). Контрольная сумма, расположенная обычно в конце модуля, обеспечивает нулевую сумму всех байтов. Длина рабочего образа, указанная в структуре данных PCI (слово со смещением 10h), описывает размер области, которая должна постоянно оставаться в памяти в режиме нормального функционирования (она может быть меньше указанной в байте 2 заголовка, поскольку код процедуры инициализации уже не требуется). Эта область также защищается контрольной суммой.

Работа с модулями ПЗУ для карт PCI выполняется в соответствии с моделью DDIM (Device Driver Initialization Model — модель инициализации драйвера устройств). POST определяет наличие ПЗУ по полю Expansion ROM Base Address в конфигурационном пространстве устройства, обнаруженного на карте, и назначает ему адрес в свободном пространстве памяти. После этого программированием регистра команд данного устройства разрешается считывание ПЗУ и в нем ищется сигнатура заголовка AA55h. Когда сигнатура найдена, POST ищет подходящий образ (по типу программного кода и совпадающий по идентификаторам с обнаруженными устройствами PCI) и копирует его в ОЗУ (в область C0000–DFFFFh), оставляя разрешенной запись в эту область. Далее чтение ПЗУ запрещается (записью в поле Expansion ROM Base Address) и вызывается процедура инициализации модуля (по адресу 3). При вызове процедуры POST сообщает номер шины (в регистре AH), номер устройства (AL[7:3]) и номер функции (AL[2:0]), благодаря чему процедура узнает точные координаты (идентификатор на шине PCI) аппаратных средств, которые ей предстоит инициализировать. После отработки инициализации определяется размер области, которую следует оставить в памяти (по байту 2, который может быть модифицирован процедурой инициализации), и для этой области запрещается запись. Если процедура инициализации «урезает» занимаемую память, она должна позаботиться о достоверности контрольной суммы области, описанной байтом 2. Если память освобождается полностью (процедура обнуляет байт 2), то контрольная сумма, естественно, не нужна. Расширение для VGA (определяется по коду класса) обрабатывается особым образом — загружается по адресу C0000h. Процедура инициализации может определить наличие PnP BIOS в системе, проверив значение контрольной структуры PnP по адресу, указанному ей программой POST в регистрах ES:DI, и исполняться в зависимости от обнаруженного системного окружения.

Для более эффективной работы во время инициализации драйвера устройства желательно использовать не только стандартную, но и расширенную память (за пределами первого мегабайта), в то время как POST работает в реальном режиме процессора. Решить эту проблему помогает режим «Big Real Mode», который поддерживают все 32-разрядные процессоры. Специально для предоставления доступа ко всей памяти процедурами инициализации фирмы Phoenics и Intel разработали спецификацию PMM (POST Memory Manager Specification), версия 1.01 была опубликована в конце 1997 года. Эта спецификация определяет несколько дополнительных сервисов BIOS, позволяющих выделять, находить и освобождать блоки в любой, в том числе и расширенной, памяти. Клиенты этого сервиса запрашивают блок памяти требуемого размера, а BIOS возвращает физический 32-разрядный адрес начала выделяемого блока (если она способна его выделить). Клиент помечает свой блок 32-битным индексом (handle), по которому его в дальнейшем можно найти функцией поиска. Анонимный блок (индекс FFFFFFFFh) поиску не поддается. Этими сервисами можно пользоваться только до начала процедуры начальной загрузки (Int 19h), работу с вентилем Gate A20 они берут на себя. Перед начальной загрузкой BIOS освобождает и обнуляет все блоки расширенной памяти, занятые с помощью этих сервисов. Наличие сервисов PMM определяется по контрольной структуре, начинающейся со строки-сигнатуры -PMM и расположенной на границе раздела в области E0000–FFFF0h.