PCプラットフォーム(IBM PCおよび派生後継コンピュータシステム)用のオプションROMは、拡張カードのROMに格納されている(またはメインシステムBIOSとともに格納されている)ファームウェアであり、デバイスを初期化し、(オプションで)BIOSにデバイスのサポートを追加するために実行されます。通常の使用では、BIOS APIとハードウェア間のインターフェースとなるドライバとして機能します。技術的には、オプションROMはPOST (基本システムハードウェアのテストと初期化)の後、BIOSブートプロセスの前にBIOSによって実行されるファームウェアであり、システムを完全に制御し、一般的に実行できる内容に制限がありません。BIOSは、各オプションROMが制御をBIOSに戻し、次のオプションROMを呼び出すか、ブートプロセスを開始できるようにする必要があります。そのため、オプションROMが制御を保持し、BIOSブートプロセスを中断することは可能ですが、一般的ではありません。 BIOS(少なくともIBMが当初設計したバージョンでは)は、通常、従来の(20ビット)メモリアドレス空間のアドレスC0000hより上の2つの異なるアドレス範囲内で、2KB間隔でオプションROMをアドレス昇順でスキャンし、初期化(実行)します。後のシステムでは、24ビットまたは32ビットの拡張アドレス空間の追加のアドレス範囲もスキャンする場合があります。
ISAの時代には、オプション ROM は、プラグアンドプレイ非対応の周辺機器を起動できるようにし、BIOS を拡張して、標準の周辺機器やマザーボード統合型周辺機器と同様に、プラグアンドプレイ非対応の周辺機器もサポートできるようにするために必要でした。オプション ROM は、BIOS を拡張したり、BIOS に他のファームウェア サービスを追加したりするためにも使用されます。原則として、オプション ROM は、ビデオ グラフィックス サブルーチンのライブラリやPCM オーディオ処理サービスのセットなど、あらゆる種類のファームウェア拡張機能を提供し、起動前にシステムRAMおよび必要に応じて CPU 割り込みシステムにインストールすることができます。
一般的なオプション ROM はビデオ BIOSで、ブート プロセスの非常に早い段階でロードされ、INT 10hをフックして、電源投入時自己診断(POST)の出力を表示できるようにします。ビデオ BIOS は、ほとんどの場合、オプション ROM 用に予約されたメモリ領域の先頭である から始まるメモリ セグメントに配置されます。これは、マザーボードにVGAC0000hコントローラが内蔵されている場合、オプション ROM は BIOS 内に配置され、BIOS はその場所を認識し、一定の時間に RAM にシャドウします。他の ROM は、初期の PC ではセグメントから まで配置できます。 [ 1 ]最新の製品では、最終検索アドレスはセグメント[ 2 ]または[ 3 ]に制限されています。BIOS ブート仕様では、オプション ROM は 2 kB 境界 (セグメントなど) にアラインメントする必要があります。ROM の最初の 2 バイトは でなければなりません。[ 4 ] 3 バイト目は、512 バイト ブロックでの ROM サイズを示します ( 16kB ROM の場合)。そして4バイト目は、BIOSがオプションROMの実行を開始し、システム起動前にそれを初期化する場所です。多くの場合、この初期化は16進数値で始まる3バイトのジャンプ命令によって行われます。 [ 5 ]C8000hF4000hDFFFFhEFFFFhC8000h, C8800h, C9000h, C9800h55 AA20hE9
プラグアンドプレイBIOS規格が開発され、広く普及する以前は、ハードディスクコントローラやネットワークアダプタカード(NIC)などのアドオンデバイスを起動可能にするには、通常オプションROMが必要でした。これは、マザーボードのBIOSがこれらのデバイスをサポートしていなかったため、BIOSのブートプロトコルに組み込むことができなかったためです。このようなオプションROMは、BIOSブート割り込みであるINT 19hをフックしてBIOSブートローダーをプリエンプトし、独自のブートローダーに置き換えます。オプションROM上のブートローダーは、アダプタカードに接続またはインストールされているディスク、ネットワーク、またはその他のブートプログラムソースから起動を試みます。起動が失敗した場合、以前のブートローダー(オプションROMがフックする前にINT 19hが指していたもの)に制御を渡し、フォールバック戦略としてシステムが別のデバイスから起動できるようにします。特定の SCSI アダプタ ( Adaptec製のものなど) のようなアダプタ カードの中には、接続された SCSI デバイスからのブートを有効にするオプション ROM の有無のみが異なるバージョンがありました。オプション ROM スキャン プロトコルの結果、最もアドレスの高いオプション ROM が最後に初期化され、割り込みをフックする最後のオプション ROM となり、割り込みサービス ルーチン(ISR) チェーンの最初のオプション ROM となります。したがって、オプション ROM のアドレスによって、ブートが有効になっているアダプタ カード間のブート優先順位が完全に決まり、マザーボード BIOS でサポートされているブート デバイスは全体として最も優先順位が低くなります。つまり、システムは、ブートが有効になっているすべてのアダプタ カードからのブートを試みた後にのみ、ブート デバイスからのブートを試みます。
BIOS Boot Specification (BBS) は、 Compaq、Intel、Phoenix Technologiesからなるコンソーシアムによって、プラグアンドプレイ (PnP) BIOS およびオプション ROM の初期化シーケンスを標準化するために開発されました。[ 3 ]この標準は、2000 年以降のほとんどのBIOSでサポートされています。この標準では、ブート接続ベクトル (BCV) テーブルと BCV の優先順位の概念が示されています。[ 3 ]この標準のコア原則により、動作がより明確でデバッグしやすくなり、BIOS メーカーは標準の提案を超えて、ユーザー向けのブート デバイス選択をさらに動的にする余地が与えられます。PnP 拡張ヘッダーの開始は 4 バイトのASCIIシグネチャでマークされ$PnP、これへのポインタはオフセット +1Ah に 2 バイトのリトルエンディアン値として格納されます。[ 6 ]
基本的な POST チェックが完了すると、BBS は、BIOS が BIOS 内に存在するすべてのオプション ROM を検出して前述の領域にシャドウイングし、PCI 構成空間を走査して XROMBAR を埋め、拡張カードのオプション ROM を MMIO 空間からその領域にコピーすることを指定します。次に、BIOS はその領域をスキャンし、オプション ROM に PnP 拡張ヘッダーがある場合は、オプション ROM ヘッダーのオフセット +03h に遠隔呼び出しを行い、それを初期化します。その後、すべての PnP オプション ROM が初期化された後、その領域を再スキャンします (付録 E に記載されているように、オプション ROM 初期化ルーチンによって、デバイスが所有する個々のディスク用にさらに多くの PnP 拡張ヘッダーがチェーンされている可能性があるため)。BCV テーブルで見つかった PnP 拡張ヘッダーに BCV ポインタ (存在する場合) または IPL 優先度テーブルに BEV ポインタ (存在する場合) を追加します。BCV テーブルの BCV エントリは、NVRAMで設定可能な優先度に従って呼び出されます。 BCV テーブルには BCV 関数ポインタが多数格納されていますが、レガシー オプション ROM を表す固定エントリがあり、これは PnP 拡張ヘッダーを持たない残りのすべてのオプション ROM で +03h を呼び出す BIOS ルーチンへのポインタです。BCV 関数は INT 13h および INT 19h フックを初期化しますが、BBS では、これらのフックは +03h の初期化ルーチンで実行してはならないと規定されています。デバイスに PnP 拡張ヘッダーがない場合、レガシー カードであるため、+03h のルーチンで任意のフックを実行できます。
初期初期化ルーチンでは、オプション ROM が PCIデータ構造(構成空間とは異なる) を指しているため、オプション ROM コードは、デバイスとベンダー ID がRIPから固定オフセットにあることを認識します。この構造の開始は 4 バイトのASCIIシグネチャでマークされPCIR、これへのポインタがオフセット +18h に 2 バイトのリトルエンディアン値として格納されます。[ 6 ]これにより、PCI 構成空間をスキャンして、使用する必要のある正しいデバイスと BAR を見つけることができます。このスキャンを防止するため、またシステムに 2 枚の同一のカードがある場合、BIOS は PFA (バス/デバイス/機能) を AX の初期化ルーチンに渡し、ISA オプション ROM のカード選択番号 (CSN) を BX に渡します。その後、PMIO / MMIOを使用してデバイスとやり取りし、 MBRを読み取ることで、ディスクの数とブート可能なディスクを確認できます。 BIOSは初期化ルーチン呼び出し前に既に構成空間を探索し、BARを割り当て、ACPIテーブルを埋めているため、オプションROMは割り当てられたBARのアドレスを使用します。一方、BCVは、ベースMMIOアドレス位置、オプションROM初期化ルーチンで確認されたディスク情報、およびBDA内の現在のディスク番号に基づいて調整される、デバイスとやり取りする割り込みルーチンをフックします。
BIOS INT 19h プロシージャは、NVRAM 内の IPL テーブル優先度を使用して、00h (フロッピーディスクBAID、ディスク 00h を登録する BCV テーブルの最初のデバイス)の MBR を読み取るブート ハンドラを含むエントリ、80h (ハードドライブ BAID、ディスク 80h を登録する BCV テーブルの最初のデバイス) の MBR を読み取るブート ハンドラを含むエントリ、またはテーブル内の BEV エントリのいずれかを呼び出すかどうかを決定します。デバイスが BEV または BCV を持つのは、それがブート可能なデバイスである場合のみです。
SCSIコントローラカードは、ディスクサービスを提供するINT 13hをフックすることができます。PnPカードの場合は、BCV内でフックが行われます。フックが完了すると、以降のINT 13hへの呼び出しはすべてSCSIオプションROM(または「SCSI BIOS」)によって捕捉され、SCSIバス上に存在する可能性のあるディスクに対して応答できるようになります。割り込みをフックする前はシステムにディスクが存在しなかったかもしれませんが、割り込みを傍受して返される値を変更することで、SCSI BIOSはSCSIバス上のすべてのディスクをシステムから認識させることができます。
この場合、BIOS 自体が INT 13h を呼び出して、使用可能なブート デバイスのリストをユーザーに提供することがあります。SCSI BIOS が割り込みをフックしているため、ユーザーは標準システム デバイスだけでなく、SCSI ディスクからもブートできるようになります。これは、ブート BIOS 仕様の付録 D で示唆されているように、BIOS は、異なるディスクへの INT 13h 呼び出しからデバイスとベンダーの情報を取得し、ハードディスク番号 (80h、81h ...) とペアにして IPL テーブルに格納することで、INT 13h をフックした最初のコントローラ (BCV テーブルで最も優先度の高い項目) の最初のディスクだけでなく、任意のハードディスク デバイスからブートできるようにするためです。このコントローラは、仕様では BIOS Aware IPL Device (BAID) と呼ばれています。
複数のコントローラが同時に INT 13h をフックできます。たとえば、SCSI コントローラの後では、AHCIコントローラも、SCSI コントローラによってエントリ 13h の IDT に格納された前のハンドラへの呼び出しを、エントリ 13h の IDT に自身のハンドラのアドレスを格納する前に、自身のハンドラの末尾に配置することで、INT 13h をフックできます。INT 13h をフックする最初のコントローラは、BIOS データ0040:0075領域 (BDA) にあるバイトをチェックして、0 個のディスクがインストールされていることを確認し、列挙するディスクが 4 個ある場合は、ディスク番号 80h ~ 83h の範囲を割り当て、BDA に「4」を格納します。INT 13h をフックする 2 番目のコントローラに 2 個のディスクがある場合は、BDA から「4」を読み取り、ディスク番号 84h と 85h を割り当て、「4」の代わりに「6」を格納します。 INT 13h が DL = 83h で呼び出された場合、ディスク番号 83h を割り当てていない 2 番目のコントローラのハンドラは、呼び出しを前のハンドラに中継します。ディスク番号 83h を割り当てたハンドラは、呼び出しを処理します。任意の数のコントローラの ISR が INT 13h にフックされている場合、指定されたドライブ番号を割り当てた ISR がその番号を認識し、呼び出しを処理して割り込みから戻るまで、各 ISR は制御を次の ISR に渡します。
もう一つの一般的なオプションROMは、ネットワークブートROMです。このオプションROMには、ブートコードをダウンロードするために必要なプログラムが含まれています。オリジナルのIBMパーソナルコンピュータROMは、INT 18H(元々はカセットBASICを呼び出すため)とINT 19Hをフックしていました。これらの2つの割り込みはブートプロセスに使用されていました。INT 19hはブートプロセスを開始するために呼び出され、INT 18hはブートプロセスでブート可能なデバイスが見つからなかった場合にROMからカセットBASICを起動するために呼び出されました。元々は、INT 18hをフックすることで、ネットワークアダプタROMは他のすべてのブートデバイス(フロッピーディスクドライブ、ハードドライブなど)が失敗した場合にネットワークからブートを試みました。INT 19Hをフックすることで、ネットワークアダプタROMは他のどのデバイスよりも先にネットワークからブートを試みました。BBSでは、NICオプションROMはINT 19hをフックせず、代わりにBIOS 19hハンドラがBEVを呼び出し、ブートコードをダウンロードするように規定されています。
ビデオBIOS は、 BIOSおよびオペレーティングシステムにいくつかの基本的な表示サービスを提供します。たとえば、INT 10H (レガシー BIOS)、VESA BIOS 拡張機能(VBE) (レガシー BIOS)、UEFI グラフィックス出力プロトコル(GOP) などです。オリジナルの IBM PC BIOS には、IBM CGA および MDA ビデオアダプタの統合サポートが含まれていました (オプション ROM は全くサポートしていませんでした)。そのため、これらのビデオ カードにはオプション ROM がありませんでした。BIOS 本体での CGA および MDA のサポートは、IBM PC XT および PC AT 製品ライン (オプション ROM をサポートしていました) を通じて維持されたため、これらのカードは (BIOS の完全なサポート付きで) これらのマシンで動作しました。オプション ROM を備えた最初の PC ビデオ アダプタ カードは、1984 年に IBM PC AT とともに導入された IBM EGA でした。 (Hercules Graphics CardにはオプションROMがなく、MDA互換機能を除いてBIOSサポートもありませんでした。MDA互換機能については、メインBIOSに搭載されたIBM提供のMDAサポートに依存していました。)その後のほとんどのPCビデオアダプタはオプションROMでサポートされていましたが、PS/2マザーボードに統合されたVGAやMCGAは統合BIOSサポートを使用していた可能性があります。クローンPCマザーボードに統合された統合型Super VGA(SVGA)がシステム本体とは別の会社から提供されるようになると、SVGAベンダー提供のビデオBIOSが、メインシステムBIOS(別の会社から提供)と同じBIOSチップ上の別のオプションROMモジュールとして含まれるのが一般的になりました。
UEFI オプション ROM は、Unified Extensible Firmware Interface (UEFI) を利用します。1 つのデバイス上の複数のオプション ROM イメージには、従来の x86 オプションROM と UEFI オプション ROM の両方を含めることができます。デバイスにおけるこのデュアル互換性により、従来の BIOS 環境と最新の UEFI 環境の両方で機能できます。UEFI セットアップでオプション ROM フォーマットが「UEFI 互換」に設定されている場合、ドライバ実行環境 (DXE) ステージでは、UEFI オプション ROM が存在する場合は、そのロードが優先されます。UEFI オプション ROM が利用できない場合は、システムは従来のオプション ROM に戻ります。UEFI システムは、互換性サポート モジュール (CSM) を介して従来のオプション ROM を利用できます。セキュア ブートが有効になっている場合、従来のファームウェア ドライバは認証をサポートしていないため、潜在的なセキュリティ 脆弱性が生じる可能性があるため、CSM および従来のオプション ROM の実行は禁止されます。[ 7 ]