Введение

Прошивка для добавления поддержки BIOS для устройства.

Опционный ROM для платформы PC (то есть IBM PC и производных компьютерных систем) – это фрагмент прошивки, расположенный в ROM на карте расширения (или хранимый вместе с основным системным BIOS), который выполняется для инициализации устройства и (опционально) добавления поддержки этого устройства в BIOS. В типичном использовании это, по сути, драйвер, который служит интерфейсом между API BIOS и аппаратным обеспечением. Технически, опционный ROM – это прошивка, выполняемая BIOS после POST (тестирования и инициализации базового системного оборудования) и перед началом процесса загрузки BIOS, получающая полный контроль над системой и, как правило, не имеющая ограничений в своих действиях. BIOS рассчитывает на каждый опционный ROM для возврата управления, чтобы он мог вызвать следующий опционный ROM или начать процесс загрузки. По этой причине опционный ROM может (хотя это и нетипично) сохранить контроль и прервать процесс загрузки BIOS. BIOS (по крайней мере, в первоначальной разработке IBM) обычно сканирует и инициализирует (выполняя) опционные ROM в порядке возрастания адресов с шагом 2 КБ в двух различных диапазонах адресов выше адреса C0000h в стандартном (20-битном) адресном пространстве памяти; более поздние системы могут также сканировать дополнительные диапазоны адресов в 24-битном или 32-битном расширенном адресном пространстве. Опционные ROM необходимы для загрузки периферийных устройств, не поддерживающих Plug and Play, и для расширения функциональности BIOS с целью обеспечения поддержки любых периферийных устройств, не поддерживающих Plug and Play, аналогично стандартным и интегрированным на материнской плате периферийным устройствам. Опционные ROM также используются для расширения BIOS или добавления других служб прошивки в BIOS. В принципе, опционный ROM может предоставлять любые расширения прошивки, такие как библиотека подпрограмм видеографики или набор сервисов обработки аудио PCM, и устанавливать их в системную оперативную память и, опционально, в систему прерываний процессора до начала загрузки. Распространенным примером является видео BIOS, который загружается на ранней стадии процесса загрузки и перехватывает INT 10h для отображения результатов самотестирования при включении питания (POST). Видео BIOS почти всегда располагается в сегменте памяти, начинающемся с C0000h – в начале области памяти, зарезервированной для опционных ROM; это связано с тем, что при наличии встроенного контроллера VGA на материнской плате опционный ROM находится в BIOS – BIOS знает его местоположение и копирует его в RAM в определенный момент времени. Другие ROM могут располагаться в сегментах от C8000h до F4000h в ранних моделях PC. Адрес последнего поиска был ограничен сегментом DFFFFh или EFFFFh в современных продуктах. Спецификация загрузки BIOS требует, чтобы опционные ROM были выровнены по границе 2 КБ (например, сегменты C8000h, C8800h, C9000h, C9800h и т.д.). Первые два байта ROM должны быть 55 AA. Третий байт указывает размер ROM в блоках по 512 байт (например, 20h для 16 КБ ROM). А четвертый байт указывает точку в ROM, с которой BIOS начинает выполнение опционного ROM для его инициализации перед загрузкой системы. Часто эта инициализация выполняется с помощью 3-байтовой инструкции перехода, начинающейся с шестнадцатеричного значения E9.

Оригинальное использование опционных ROM-файлов для загрузки с помощью карт расширения

До разработки и повсеместного внедрения стандарта Plug and Play BIOS, для дополнительного устройства, такого как контроллер жесткого диска или карта сетевого адаптера (NIC), как правило, требовалось включать опционный ROM для обеспечения возможности загрузки, поскольку BIOS материнской платы не поддерживал данное устройство и не мог включить его в протокол загрузки BIOS. Такой опционный ROM перехватывал прерывание INT 19h, прерывание загрузки BIOS, чтобы прервать работу загрузчика BIOS и заменить его собственным. Загрузчик, содержащийся в опционном ROM, пытался загрузиться с диска, сети или другого источника загрузочной программы, подключенного к адаптеру или установленному на него; если эта попытка загрузки не удавалась, управление передавалось предыдущему загрузчику (на который указывал INT 19h до перехвата опционным ROM), что позволяло системе загрузиться с другого устройства в качестве резервного варианта. Некоторые адаптерные карты, например, определенные адаптеры SCSI (например, некоторые производства Adaptec), были доступны в версиях, отличавшихся только наличием или отсутствием опционного ROM для загрузки с подключенных устройств SCSI. В результате протокола сканирования опционных ROM, опционный ROM с наивысшим адресом инициализируется последним и, следовательно, последним перехватывает прерывания и первым включается в цепочки обработчиков прерываний (ISR); таким образом, адреса опционных ROM полностью определяют приоритет загрузки между адаптерными картами, поддерживающими загрузку, а устройства загрузки, поддерживаемые BIOS материнской платы, имеют наименьший приоритет, то есть система будет пытаться загрузиться с них только после попыток загрузки со всех адаптерных карт, поддерживающих загрузку.

Спецификация загрузки BIOS

Спецификация загрузки BIOS (BBS) была разработана консорциумом, включающим компании Compaq, Intel и Phoenix Technologies, для стандартизации последовательности инициализации BIOS и опционных ROM-модулей Plug and Play (PnP). После завершения основных проверок POST, BBS определяет, что BIOS должен обнаружить и затенить все опционные ROM-модули, находящиеся в BIOS, в указанной области, а также просканировать пространство конфигурации PCI, заполняя XROMBAR и копируя опционные ROM-модули карт расширения из пространства MMIO в эту область. Затем BIOS сканирует область, и если опционный ROM-модуль содержит заголовок PnP Expansion, он выполняет вызов по адресу +03h в заголовке опционного ROM-модуля для его инициализации. После этого он повторно сканирует область после инициализации всех опционных ROM-модулей PnP (поскольку, как указано в приложении E, процедура инициализации опционного ROM-модуля PnP может содержать цепочку дополнительных заголовков расширения PnP для отдельных дисков, принадлежащих устройству). Он добавляет указатель BCV (при наличии) из заголовков PnP Expansion в таблицу BCV или указатель BEV (при наличии) в таблицу приоритетов IPL. Записи BCV в таблице BCV вызываются в соответствии с приоритетом, задаваемым в NVRAM. Таблица BCV содержит указатели на функции BCV, но имеет фиксированную запись, представляющую устаревшие опционные ROM-модули, которая является указателем на подпрограмму BIOS, вызывающую +03h во всех оставшихся опционных ROM-модулях, не имеющих заголовок PnP Expansion. Функция BCV инициализирует перехватчики INT 13h и INT 19h, что, согласно BBS, не должно выполняться в процедуре инициализации по адресу +03h. Если устройство не имеет заголовка PnP Expansion, оно может выполнять любые перехватчики в процедуре по адресу +03h, поскольку это устаревшая карта. В начальной процедуре инициализации, поскольку опционный ROM-модуль указывает на структуру данных PCI (отличную от пространства конфигурации), код опционного ROM-модуля знает, что идентификатор устройства и поставщика находится в фиксированном смещении от RIP. Начало этой структуры отмечается 4-байтовой ASCII-подписью PCIR, а указатель на нее хранится в смещении +18h в виде 2-байтового значения в формате little endian.