Basic Input/Output System

ユーザーインタフェースの変遷

IBM PCとXTの時代にはユーザーインタフェース (UI) は用意されていなかった。XT世代以前のPCのBIOSはソフトウェアによる設定はできず、マザーボード上のディップスイッチを切り替えて設定していた。以降、80286CPU搭載機までの時代はBIOS設定は電池でバックアップされたCMOSメモリに保存されていた。ビデオカードの形式、メモリーサイズ、ハードディスクのパラメータは設定プログラムを実行する必要があり、IBM ATの場合、これはROMに組み込みではなく "reference diskette" という特別なディスクを挿入して行わなければならなかった。
近代的なWintel互換PCと共に普及した、ROMに組み込まれたセットアップユーティリティの方式は1990年代から変わっていない。ユーザーは画面を見ながらメニュー形式のユーザーインタフェースをキーボードで操作することができ、ブート時にエラーが起こった場合にはユーザーフレンドリーなテキストUIによるポップアップメッセージ、BIOSセットアップユーティリティで修正するか無視して続行といったメニューを表示できる。また近代的なWintel互換機ではBIOS設定をバッテリーバックアップRAMではなくフラッシュROMに書き込むものもある。
PCにおいて、後述する設定画面を指してBIOSと称する向きもあるが、厳密には誤りである。

ハードウェアアクセス方法の実装と共通化

ハードウェアへのアクセスは主に入出力レジスタの操作を行うが、レジスタの動作や配置はハードウェアの種類によって異なる。また、読み書きのタイミングや順序にも所定の手順が設けられている。これらのハードウェアアクセス手順はアプリケーション側で逐一記述するより、ハードウェアの種類とセットでサブルーチンの形で用意しておくほうが有用である。このサブルーチンのことをBIOSと呼び、ISAやPCIボードなどの形の製品では同一ボード上にROMを搭載し、そのBIOSプログラムをメモリ上に配置（メモリマッピング）する。それら拡張カード上に実装されたBIOSと区別するとき、マザーボード側に実装されたBIOSをSystem BIOS（システムバイオス）と呼ぶ。加えて拡張カード側のBIOSを、System BIOSに対して拡張BIOSと呼ぶことがある。
また、同じ種類のハードウェアでも操作方法が異なるデバイスが複数存在する場合、BIOSがない場合はアプリケーション側でそれぞれのハードウェア構成にあったアクセス手順を複数用意しておかなければならない。そこでBIOSの呼び出しインタフェースを共通化することで、アプリケーションはそのBIOSのサービスを呼ぶだけで複数のデバイスに対応できることになる。このような共通インタフェースはApplication Binary Interface（ABI、参考API）と呼ばれる。
PC/AT互換機のVGA BIOSを例に挙げると、共通化されたABIであるVGA BIOS（Video BIOS（ビデオバイオス）とも通称される）を呼び出すことで、ハードウェアの違いを意識することなく一元的に文字の表示や画像の表示を行えるようにしたものである。これはビデオカード上のROMとして実装され、先述した「拡張BIOS」の一種である。
同様にハードディスクやフロッピーディスクの読み書き、キーボード入力などさまざまな入出力機器の処理を行うBIOSが存在する。それら基本的な入出力を司るBIOSは先述のSystem BIOSに内包されマザーボード上のROMとして実装される。
しかし上記の方法が有効なのはOSがシングルタスクの場合である。マルチタスクOSの場合はこの役割がデバイスドライバにとって代わられている。マルチタスクOSが動作している場合、各アプリケーションが個別にBIOSを呼び出すとリエントラントが考慮されていないBIOSもありOSもハードウェアリソースを管理することが難しくなる。このためOSが動作するシステム上では、ハードウェアの管理はOSがデバイスドライバを用いて一元的に行い、アプリケーションはOSが用意しているシステムコールを利用する。
アプリケーションが、OSのシステムコールではなくどうしてもBIOSコールを使いたい場合は、BIOSを呼び出すシステムコールが用意されているが、そのBIOSがアクセスするハードウェアがOSによって保護されている場合は、必ずしも動作するとは限らない。
また、組み込みシステムではハードウェアのバリエーションが少なく、BIOSといった中間層インタフェースは持たないためBIOSとは呼ばずファームウェアと呼ぶことが多い。

起動

装置の電源投入時には、最初に実行されるハードウェアの初期設定および、次の段階のブートローダーを読み込むプログラムが必要になる。このため補助記憶装置を操作し、ファイルの読み込みが行える状態になるまでのプログラムをROMの形で用意しておく必要がある。これらのプログラムはInitial Program Loader (IPL) やブートストラップローダとも呼ばれる。補助記憶装置のハードウェアの構成によって手順が異なるため、そのシステム固有のプログラムが用意される。
プロセッサがリセットされると、リアルモードのアドレス空間1MB内最後尾付近の固定されたアドレス(0FFFF0h 番地)にある命令を実行する。BIOS ROMの内容はメモリにマップされており、前述のアドレスはこれの内部にある。そのアドレスに記されたジャンプ命令により、BIOSの実行コードの先頭にジャンプして処理が開始される。
システムが電源が投入された場合（「コールドブート」）はPower On Self Test (POST) が実行され、リセットボタンが押された場合（「ウォームブート」）はPOSTを省略し、メモリのテストにかかる時間を節約する。
Power On Self Testは、CPU、RAM、割り込み、DMAコントローラなどの搭載デバイスのほかに、チップセット、ビデオカード、キーボード、ハードディスク、光学ドライブその他の基本的なハードウェアによるシステム構成をテスト、認識、初期化する。次いでBIOSは起動デバイスに設定された記憶装置を探し、ブートローダープログラムの場所を特定して実行し、PCのコントロールを委ねる。この過程をブートストラップ、略してブートと呼ぶ。
また、PC/AT互換機のように、様々な種類のハードウェアが増設可能な（バリエーションが多い）場合、初期化手順やハードウェア構成に自由度を持たせておく必要があり、初期化内容などをディップスイッチやソフトスイッチで設定可能にするためパラメータを持つ場合がある。

BIOS拡張

IBM PCおよびAT互換機の場合、ハードディスクコントローラやビデオカードはBIOSを拡張するオプションのROMを搭載しており、追加の機能を提供している。拡張部のコードはオペレーティングシステムが記憶装置から読み出される前に実行される。これらのROMはハードウェアのテストと初期化を行い、BIOSの新しいサービスを提供あるいは既存のものを上書きする。
たとえばSCSIコントローラの場合は接続されたドライブにアクセスするBIOSを提供し、あるビデオカードの例ではマザーボードに搭載されたBIOSのビデオカードに取って代わる。
BIOS拡張ROMはPC全体のコントロールを取得することができ、事実上何でも行うことができる、よって呼び出し側のBIOSに全く制御を返さないこともありうる。拡張ROMには原理的にはオペレーティングシステム、またはアプリケーションを丸ごと搭載することもでき、またネットワークからブートするような全く違うブートプロセスを実装することもできる。IBM PC互換のシステムではBIOS拡張ROMを搭載したアダプタカード(やROMチップ)を付け外しすることで、動作を全く違うものに変更することができる。
マザーボード上のBIOSは通常はシステムをブートさせるために必要なハードウェアコンポーネントであるキーボード、ディスプレイ、ストレージなどにアクセスするためのコードを内蔵しており、アダプタカードたとえばSCSI、RAID、ネットワークインタフェースカード、ビデオボードなどは独自のBIOSを搭載しており、これらがシステムBIOSのコンポーネント用のコードを置き換える。マザーボード上に組み込まれたオンボードデバイスでも動作は同様で、それらのROMはBIOSのフラッシュメモリ上でも別々のコードになっているため、アップグレードをメインBIOSと同時または別々に適用することもできる。
あるアドインカードがブート時に必須のものである場合は、もしメインBIOSにサポートされていない場合はオプションROMが必要で、それはBIOSのサービスによりオペレーティングシステムの読み込みに先立って初期化され、アクセス可能になっていなければならない。もし必須でない場合でも、オプションROMがあれば、ブート途中にストレージドライバがなくてもデバイスにアクセスできるようになり、かつRAMやハードディスクを占有する必要もない。またデバイスとドライバが必ずセットであるためインストールの手間が不要という利点がある。かつてのPCではシステムのRAMよりROMのほうがアクセスが早いという利点もあったが現在は逆で、BIOS ROMのコードはRAMにコピーされる（シャドウと呼ばれる)ようになっている。
マザーボードのBIOSと拡張ROMの内容を調べるには多数の手法とユーティリティが用意されており、一例としてはマイクロソフトのDEBUG や Unix系のdd (UNIX)がある。

初期化

マザーボード上のBIOSはPOSTを完了した時点で、ほとんどのバージョンの場合オプションROMモジュール（BIOS拡張ROM）を探しに行き実行する。
BIOSは"Upper Memory Area"空間（x86リアルモードでは0xA0000以上のアドレス空間）をスキャンして、発見されたROMのコードを順次実行する。ISA カード上のROMを探す場合、BIOSは0x0C0000 から 0x0F0000 の空間を2 KiB 毎の領域でスキャンして"0x55""0xAA"という連続した2バイトのシグネチャを探してROMのプログラムのエントリポイントを知り、先頭512バイトのブロックのチェックサムを算出して、ROMのチェックサムと一致すればBIOSはそのエントリーアドレスに制御を移す。するとBIOS拡張ROMは拡張機能の初期化ルーチンの実行を始める。
この時点で拡張ROMは実行を引継ぎ、一般的には対象ハードウェアのテストと初期化、ブート後のアプリケーションから利用する割り込みベクターの登録を行う。拡張ROMはユーザー設定インタフェース(診断情報の表示その他）や必要な動作のためにBIOSとそれまでに読み込まれたBIOS拡張ROMのサービスを利用する。
オプションROMは一般的には初期化プロセスの完了時にはBIOSに制御を返す。制御を返されたBIOSは、さらにオプションROMがないかメモリ空間の末尾までサーチを進め、見つけた順に呼び出す動作を繰り返す。

プロセッサのマイクロコード更新

IntelのP6マイクロアーキテクチャ世代以降では、プロセッサのマイクロコードに対するパッチをBIOSに含めることができる。マイクロコードはシステムが起動する度に更新される。この仕組みのない時代にはCPUのバグがあるとCPUの差し替えになり、過去の事例ではPentium FDIV バグによるCPUのリコールが発生したことがある。

識別

デルなどが提供する一部のBIOSは "SLIC" (software licensing description table) という電子署名を内蔵している。(一部ではBIOSタトゥー(刺青)と俗称される) SLICはACPIテーブルに挿入されており、実行コードは含まない。
コンピュータメーカーはWindowsやマイクロソフト製アプリケーションをバンドルするにあたりSLICをもとに認証する例があり、またWindowsソフトウェアを含むシステムリカバリーディスクもこれを利用する。SLICありのシステムでは、コンピュータ製品を対象にしたOEMプロダクトキーでソフトウェアが予めアクティベートしてあり、BIOSのSLICに書かれたXML形式のOEM証明書と照合することで自動アクティベートが実現されている。ユーザーがWindowsのクリーンインストールを行う場合には、OEMキーとSLIC認証の両方が揃っていないとアクティベーションを回避できないが、本来はOEMにより予めカスタマイズされたイメージでリストアするべきものであるため状況としては考えにくい。海賊版Windowsでは、アクティベーションを回避するためにSLICを編集するかエミュレートしている。

オーバークロック

一部のBIOSではオーバークロック機能を提供する。これはCPUのクロック周波数をメーカーの保証値より高く引き上げるものである。しかしながらオーバークロックはコンピューターの冷却不足による信頼性の低下と寿命の短縮を招く深刻な悪影響がある。
不適切なオーバークロック設定は部品のオーバーヒートを招き、機械的にコンピュータを壊してしまうこともありうる。

近年の使われ方

近年のBIOSはこれまでに紹介した以上に複雑な、例えばAdvanced Configuration and Power Interface (ACPI)機能を装備しており、電源管理、ホットスワップ、温度管理などを提供する。
近年はUnified Extensible Firmware Interface (UEFI) への移行が進んでいる。

設定初期化（CMOSクリア）

PCトラブルの際に、BIOSの可変設定部分を初期状態に戻す事で解決するケースがある。
マザーボードのBIOSバックアップ用電池をいったん外し、しばらく待ってから（30秒〜1分）電池を入れなおすことで設定が初期化される。確実を期すなら、外した電池を戻す前に電池ホルダのプラス極とマイナス極を金属（例えばピンセット）で短絡させるのが良い。あるいは、マザーボードによってはBIOS初期化のリセットスイッチや、ジャンパポストが装備されている。またBIOSによってはメニュー内から初期化機能を持っているものがある。
この行為は、「CMOSクリア」と通称されている。また、しばしば誤って「BIOSを初期化する」と表されることがあるが、可変設定部分を初期化するための作業であって、BIOSプログラムそのものを書き換える訳ではなく、メーカーが用意した初期設定値が可変設定部分に読み込まれるに留まる。ファームウェア更新に失敗した場合などに備え、BIOSプログラム全体を初期の状態に書き戻す機能を備えたBIOS・マザーボードもあるが、この場合は文字通り「BIOSを初期化する」と言って良い。

BIOSのチップ

初代のIBM PCではBIOS（およびcasette BASIC）はマスクRead Only Memory(ROM)チップに格納され、マザーボードのソケットに挿入されていた。ROMは交換が可能だったが、ユーザーによる書き換えは出来なかった。更新を可能にするために、互換機メーカーはEEPROM、後年にはフラッシュメモリなどの再プログラム可能なデバイスを採用するようになった。
BIOS製造会社 Micro Firmware社のRobert Braver社長によると、Flash BIOSチップは1995年頃から主流になり、紫外線により消去するPROMより安価かつ扱いが容易になったためとしている。EPROMでは書き換えのためにマザーボードから取り外す必要があるのに対し、フラッシュメモリは基板上に付けたまま再プログラムが可能である。

BIOSの書き換えとトラブル

BIOSはROMに格納され、コンピュータに組み込まれた形で提供される（2011年現在、BIOS ROMはLow Pin CountバスまたはSPIによってサウスブリッジに接続される）。基本的にはBIOSは書き換える必要がないものだが、バグの修正や新機能サポート時に更新されることがある。
1990年代中頃までのPCでは、ROMとしてマスクROMやOTPROM、UV-EPROMなどが用いられ、大きな問題がない限りBIOSの更新はあまり想定されていなかった。また、ROMの書き込みにはROMライターといった装置が必要になり、ユーザの手元ではROMは書き換えられないのが普通であった。
フラッシュメモリが実用化され普及してくると、BIOSをフラッシュメモリに格納しユーザの手元でコンピュータを開けずにアップデートできることを売りにしたマザーボード製品が発売された。具体的な書き換え方法としては、書き換え用にフロッピーディスクに簡素なOS（主にMS-DOSやその互換OSが利用される）の環境を作成、そこから起動し、書き換え用ソフトウェアを起動することで簡単に書き換えを行う事が可能となった。さらに2000年以降はフロッピーディスクから起動せずともWindowsやUnix系OSといった統合環境上で直接書き換えすることができるようになった。現在では、「BIOSの設定画面上でBIOSを書き換える」といったシステムを備えたBIOSも登場し、書き換え方法の選択肢が広がっている。
しかしBIOSの書き換え中に停電など何らかのトラブルで書き換えに失敗した場合、大抵そのコンピュータは全く起動しなくなる。したがって、メーカーは「PCに問題があってその解決方法がBIOSアップデート以外に存在しないときやOSのアップデート時にのみアップデートを実行してください」などと注意を促している。
BIOSはコンピュータの起動の根幹であるため、内容が破壊されるとそのコンピュータ自身では再セットアップすら出来なくなる。(空っぽのフロッピーやUSBメモリなどを使った復旧手段を用意しているBIOSがほとんどだが、それが失敗するか存在しない場合は)復旧する方法はBIOS ROMの交換(大抵の場合は精密なはんだ付けが必要なためメーカー修理となる)、または専門の業者などで「ROM焼き」と呼ばれる復旧作業をしてもらうのいずれかである。BIOS ROMがソケットに差し込まれているタイプのマザーボードでは自身で同一のマザーボードを用意し、起動後に問題のあるBIOS ROMに差し替え再書き込みをするという荒業も可能ではあるが、起動中のコンピュータのBIOS ROMを抜く事は大変危険である為推奨されない。また、2000年以降に出回っているコンピュータ（マザーボード）によっては、ROMを2つないし4つ持っているものもあり、別バージョンへの切り替えができるようになっているものもある。

ブートブロック方式

以上に述べたように、BIOSの書き換えにはリスクを伴うが、このリスクの低減を図る目的で開発されたのがブートブロック方式であり、1999年ころから採用されるようになった。
これは、BIOS ROMを2つ以上の領域に分割し、出荷後に書き換えない部分と書き換える部分を設けるものである。書き換えない部分をブートブロックといい、BIOSを書き換えるための必要最小限の機能が含まれている。したがって、書き換え中の電源断などで書き換えに失敗した場合でも、ブートブロックを使用することで再度書き換えを実施することが可能である。

BIOSとマイクロコード

BIOS ROMには時としてマイクロコードが格納される。マイクロコードを利用するデバイスは、CPU（インテル Pentium Pro、AMD Athlon以降）、SCSIホストバスアダプタ（アダプテック社製品等）、ネットワークインタフェース（マーベル・テクノロジー・グループ社、ブロードコム社製品等）等がある。これらはBIOSブート初期の段階でマイクロコードがデバイスに転送され、デバイスが活性化される。またマイクロコードではないが、FPGAベースのデバイスではロジックをBIOSが書き込んで活性化させる物もある。マイクロコードやロジックは新製品や機能改良によってバージョンアップが必要になる事がある。特にCPUのマイクロコードは新製品が出る都度に新しいマイクロコードが必ずといって良い程作られるので、マザーボードに最新CPUを搭載する為にBIOSアップデートによって最新のマイクロコード導入が必要となる場合がある。グラフィクスカードはマイクロコードを使用するにも関わらず例外的にBIOS ROMには含まれていない。通常、VGA相当の専用回路でVGA BIOS機能を提供し、OS起動後デバイスドライバを経由してアプリケーション上のシェーダプログラムをマイクロコードにコンパイルしてGPUに転送して実行している。

代替・後継製品

2014年現在、新製品のBIOSはより複雑なUnified Extensible Firmware Interface (UEFI) に置き換えられつつある。UEFIはレガシーBIOSのランタイムインタフェースを置き換えるもので、元はItaniumプラットフォーム向けに書かれたが、現在はx86とx86-64プラットフォームにも提供されており、仕様はUnified EFI Forumの主導で開発されている。UEFIによるブートはWindowsのうちGPTをサポートするバージョン、Linuxカーネル2.6.1以降、macOSのうちIntel Macで動作するもの に限られる。
従来のレガシーBIOSに代わるものとしては、ほかにOpen Firmware（OLPC XO-1で使用）、corebootなどが存在する。
他の系列のコンピュータでは、ブートモニタ、ブートローダー、ブートROMなどの語が使われる。ワークステーション分野ではOpen Firmware (IEEE-1275) があり、Forth言語で記述されている。サンのSPARC コンピュータ、IBMの RS/6000 シリーズ、その他PowerPCを搭載するCHRPマザーボードに採用されている。