Basic Input/Output System

Basic Input/Output Systemとは、ファームウェアの一つで、コンピュータに搭載されたプログラムのうち、ハードウェアと最も低レベルな入出力を行うためのプログラムである。

大きく意味合いとして

IBM PC XTから搭載されている仕組み。UEFIとは同列の概念。
一般的なコンピュータハードウェア資源に入出力するプログラム。UEFIやIBM PC XTやMSXなどのBIOSの上位概念。がある。

1. 概要
-----

BIOSはパーソナルコンピュータに組み込まれており、電源投入と同時に実行される。ハードウェアを初期化し補助記憶装置からブートローダーを呼び出す。またキーボードやディスプレイなどの入出力装置をプログラムから利用するためのサービスを提供する。プログラムはハードウェアに直接アクセスするのではなく、これらサービスを利用する事でハードウェア差を気にしなくて良くなる。ただし近代的なオペレーティングシステム  はこの抽象化層を使用せず、OSのデバイスドライバで直接制御する場合が多い。

IBM PC/XTのオリジナルのBIOSにはユーザインタフェースが無く、基板上のジャンパスイッチで設定した。システム不具合時はエラーメッセージとブザー音で通知した。近代的なPCでは、起動時に特定のキーを押すことで設定プログラムが起動し、画面とキーボードで設定を行える。

1980年代より1990年代中盤まで主流であったMS-DOSはディスク、キーボード、画面表示などBIOSのサービスに依存していた。Microsoft Windows NT、Linux、プロテクトモードで動作中のOSでは一般にOSのロードと起動までを担い、起動後はBIOS割り込みルーチンを使用しない。

BIOSはマザーボードの不揮発性メモリに格納され、デバイスとチップセットのインタフェースを担う。初期のモデルではEP-ROM等に格納され、BIOS書き換え時はマザーボードからチップを取り外し、専用装置で書き換えた後、再装着する必要があった。近代ではフラッシュメモリに格納され、取り外しなしでも書き換えが可能である。これにより更新やバグ修正が容易になった代わりにRootkitに脆弱になる可能性が生じた。

2010年からUnified Extensible Firmware Interface  に移行されている。UEFIはBIOSの技術的問題に対処することを目的とした後継である。

2. 用語と歴史
--------

ゲイリー・キルドールがCP/Mの用語として1975年に初めてBIOSを用いた。OS起動時にマシン固有のハードウェアにアクセスする部分を記述していた。後に他機種にも使われ、PC/AT互換機でもデファクトスタンダードとなった。

MS-DOSやPC DOS、DR-DOSに存在するファイル "IO.SYS"、"IBMBIO.COM"、"IBMBIO.SYS"、"DRBIOS.SYS" などを"CP/M BIOS" になぞらえて "DOS BIOS" と呼ぶ場合がある。

PS/2でIBMはBIOSをリアルモードとプロテクトモードに分割した。リアルモード部は既存のOSとの互換性を目的とし "CBIOS"  と呼び、OS/2などのマルチタスクOSのために作成された部分を"ABIOS"と呼んだ。

3. ユーザーインタフェース
--------------

IBM PCとXTの時代には設定のユーザーインタフェース  はマザーボード上ディップスイッチであった。それ以降は画面に表示されたメニューをキーボードで操作するインタフェースである。マウスによる操作が出来るものもある。以降80286CPU搭載機までは電池でバックアップされたCMOSに保存されていた。IBM ATではビデオカード、メモリーサイズ、ハードディスクを設定するには、ROMのプログラムではなく "reference diskette" という特別なディスクを挿入して行わなければならなかった。

PC/AT互換PCではセットアップユーティリティで各種設定をする。この方式は1990年代から変わっていない。ユーザーは画面に表示されたメニュー形式のインターフェースをキーボードで操作する。ブートに失敗した場合にはテキストメッセージが表示され、ユーティリティで設定を修正する、無視して続行する等のユーザーフレンドリーな表示が可能である。またBIOS設定は電池でバックアップされたRAMではなくフラッシュROMに格納するものもある。

設定画面をBIOSと称する向きもあるが厳密には誤りである。

4. ハードウェアアクセスの共通化
-----------------

ハードウェアへのアクセスは主に入出力レジスタの操作で行うが、その動作や配置はハードウェア種によって異なる。また、読み書きのタイミングや順序にも手順がある。このためアクセス手順はアプリケーションで記述するより、ハードウェア種毎にサブルーチンを用意する方が有用でありこれがBIOSである。ISAやPCIなどではボードのROMにBIOSプログラムがあり、これはメモリ上に展開されてアプリケーションから利用される。マザーボード側のBIOSをSystem BIOS、拡張カードのBIOSを拡張BIOSと区別して呼ぶことがある。

また同種のハードウェアでも操作方法が異なる場合もある。これに対処するためBIOSの呼び出しインタフェースは共通化されており、アプリケーションはBIOSサービスを呼ぶだけで複数のデバイスに対応できる。このような共通インタフェースはアプリケーションバイナリインタフェースと呼ばれる。

例として、PC/AT互換機のVGA BIOSは、共通化されたABIを呼び出す事でハードウェアの違いを意識せず文字、画像の表示を可能にした。これはビデオカードのROMに実装された拡張BIOSである。 同様にハードディスク、フロッピーディスク、キーボードなどさまざまな入出力処理を行うBIOSが存在するが、これら基本的なものはSystem BIOSでありマザーボードのROMに実装される。

しかし、上記が有効なのはOSがシングルタスク型の場合であり、マルチタスクOSではデバイスドライバが処理を行う。特にリエントラントが考慮されていないBIOSもあり、各アプリケーションが非同期にこれを呼び出すとOSはハードウェアリソース管理が困難になる。このためハードウェア管理はデバイスドライバが一元的に行い、アプリケーションはOSのシステムコールを利用する。

やむを得ずBIOSを呼び出したい場合、専用のシステムコールで可能だが、そのハードウェアがOSに保護されている場合は動作するとは限らない。

組み込みシステムではハードウェアのバリエーションが少なく、BIOSのような中間層インタフェースは持たないためファームウェアと呼ばれることが多い。

5. 起動
-----

電源投入時、ハードウェアの初期化およびブートローダーを読み込むプログラムが必要になる。つまり補助記憶装置からファイルの読み込みが行える状態になるまでのプログラムをROMに用意しておく必要がある。これらのプログラムはInitial Program Loader  やブートストラップローダとも呼ばれる。

プロセッサがリセットされると、リアルモードのアドレス空間1MBの内、最後尾付近のアドレスにある命令を実行する。そのアドレスに記されたジャンプ命令により、BIOSの実行コードの先頭にジャンプして処理が開始される。電源が投入された場合はPower On Self Test  が実行され、リセットボタンが押された場合はPOSTを省略し、メモリのテストにかかる時間を節約する。

Power On Self Testは、CPU、RAM、割り込み、DMAコントローラなどの搭載デバイスのほかに、チップセット、ビデオカード、キーボード、ハードディスク、光学ドライブなどのハードウェアのシステム構成をテスト、認識、初期化する。次いでBIOSは起動デバイスに指定された記憶装置を探し、ブートローダープログラムの場所を特定して実行、PCにコントロールを委ねる。この過程をブートストラップ、略してブートと呼ぶ。

PC/AT互換機のように、様々な種類のハードウェアが増設可能な場合、初期化手順やハードウェア構成に自由度を持たせておく必要がある。初期化内容などをディップスイッチやソフトスイッチで設定できる場合がある。

5.1. BIOS拡張
-----------

IBM PCおよびAT互換機の場合、ハードディスクやビデオカードはBIOSを拡張、追加機能を提供するオプションのROMを搭載している。拡張部のプログラムはOSが補助記憶装置から読み出される前に実行される。これらプログラムはハードウェアのテストと初期化を行い、BIOSに新しいサービスを提供あるいは既存のものを上書きする。

例えばSCSIコントローラーは接続されたドライブにアクセスするBIOSを提供し、ビデオカードではマザーボードに搭載されたBIOSのビデオカードに取って代わる。

BIOS拡張ROMはPC全体のコントロールを取得でき、事実上何でも行うことができる。呼び出し側のBIOSに制御権を返さないこともありうる。原理的にはOSまたはアプリケーションを丸ごと搭載する事も出来る。また、ネットワークからブートするような全く違うブートプロセスにすることもできる。IBM PC互換機ではBIOS拡張ROMを搭載したアダプタカードを着脱することで、動作を全く違うものに変更できる。

マザーボードのシステムBIOSはブートに必要なキーボード、ディスプレイ、ストレージなどのコードを内蔵している。アダプタカードは独自のBIOSを搭載しており、これらはシステムBIOSを置き換える。マザーボードに組み込まれたオンボードデバイスでも動作は同様である。それらのROMはBIOSのフラッシュメモリ上でも別々のコードになっているため、システムBIOSと同時または別々にアップグレードすることもできる。

あるアダプタカードがブート時に必須でありかつシステムBIOSがこれをサポートしていない場合、オプションROMが必要となる。また、オプションROMがあればストレージドライバがなくてもブート途中にデバイスにアクセスできるようになる。RAMやハードディスクを占有する必要もない。また、デバイスとドライバが必ずセットであるためインストールが不要という利点もある。

システムBIOSと拡張ROMの内容を調べるには多数の手法とユーティリティがあり、一例としてはマイクロソフトのDEBUG や Unix系のdd がある。

5.2. 初期化
--------

マザーボード上のBIOSはPOSTを完了した時点で、ほとんどのバージョンの場合オプションROMモジュールを探しに行き実行する。 BIOSは"Upper Memory Area"空間をスキャンして、発見されたROMのコードを順次実行する。ISA カード上のROMを探す場合、BIOSは0x0C0000 から 0x0F0000 の空間を2   KiB 毎の領域でスキャンして"0x55""0xAA"という連続した2バイトの//シグネチャ//を探してROMのプログラムのエントリポイントを知り、先頭512バイトのブロックのチェックサムを算出して、ROMのチェックサムと一致すればBIOSはそのエントリーアドレスに制御を移す。するとBIOS拡張ROMは拡張機能の初期化ルーチンの実行を始める。

この時点で拡張ROMは実行を引継ぎ、一般的には対象ハードウェアのテストと初期化、ブート後のアプリケーションから利用する割り込みベクターの登録を行う。拡張ROMはユーザー設定インタフェース(診断情報の表示その他）