Basic Input/Output System
Basic Input/Output System（ベーシック インプット/アウトプット システム、頭字語：BIOS（バイオス））とは、ファームウェアの一つで、コンピュータに搭載されたプログラムのうち、ハードウェアとの最も低レベルの入出力を行うためのプログラムである。
BIOSソフトウェアはパーソナルコンピュータ (PC) に組み込まれており、電源投入と同時に実行される。主な働きはハードウェアを初期化して記憶装置からブートローダーを呼び出すことで、そのほかにキーボードやディスプレイなどの入出力装置とプログラムが相互に作用するための抽象化した層（）を提供する。システムのハードウェアの差異はBIOSによって隠され、プログラムはハードウェアに直接アクセスするのではなくBIOSが提供するサービスを利用する。近代的なオペレーティングシステム (OS) はこの抽象化した層を使用せず、OS自身が持つデバイスドライバでハードウェアに直接制御する場合がある。
IBM PC/XTのオリジナルのBIOSではユーザインタフェースを提供せず、設定は基板上のジャンパスイッチで行ない、システムに不具合がある場合はエラーメッセージの表示とブザー音でエラーを通知した。近代的なWintelベースのコンピュータでは、起動時に特定のキーを押すことでセットアップルーチンが起動し、画面とキーボードで設定を行えるようになっている。
1980年代より1990年代中盤まで独占的な地位を占めていたMS-DOSはディスク、キーボード、画面表示などでBIOSのサービスに依存していたが、MS Windows NT、Linux、その他プロテクトモードで動作するOSでは一般に、BIOSはOSのロードと起動までを担い、起動後にはBIOSを使用しない。
すべてのBIOS実装は特定のコンピュータまたはマザーボード機種毎に実装され、装備するデバイスとチップセットのインタフェースを担う。
BIOSはマザーボード上の不揮発性メモリに格納されており、コンピューターのモデル毎に設計されている。初期のモデルではEP-ROM等に格納され、BIOSを書き換える場合はマザーボードからチップを取り外し、専用の書き換え装置で書き換えてからマザーボードに再度装着する必要があった。近代的なコンピュータではフラッシュメモリに格納され、マザーボードから取り外さなくても書き換えが可能になっている。これによりBIOSの更新やバグフィックスが容易になった代わりに、BIOSがRootkitに対して脆弱になる可能性が生じている。
BIOSテクノロジーは、2010年からUnified Extensible Firmware Interface (UEFI) に向けての移行の途上にある。
"BIOS" とはもともとはゲイリー・キルドールがCP/Mの用語として1975年に初めて用いたもので、OS起動時にマシン固有のハードウェアにアクセスする部分を記述していた。その後、他機種に対しても一般的に使われ、PC/AT互換機のファームウェアにおけるデファクトスタンダードとなった。
MS-DOSやPC DOS、DR-DOSでは含まれるファイル "IO.SYS"、"IBMBIO.COM"、"IBMBIO.SYS"、"DRBIOS.SYS" などを、"CP/M BIOS" になぞらえて "DOS BIOS" と呼ぶ場合がある。(一般にCP/M対応機のROMには簡素なブートローダーしか格納されていない)
PS/2コンピュータの登場に伴い、IBMはシステムBIOSをリアルモード部とプロテクトモード部で分割し、リアルモード部は既存のOS（DOS等）との互換性のために用意されて "CBIOS" (Compatibility BIOS) と呼び、OS/2などのマルチタスクオペレーティングシステムのために作成された部分を"ABIOS"(Advanced BIOS)と呼んだ。
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互換機のように、様々な種類のハードウェアが増設可能な（バリエーションが多い）場合、初期化手順やハードウェア構成に自由度を持たせておく必要があり、初期化内容などをディップスイッチやソフトスイッチで設定可能にするためパラメータを持つ場合がある。
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はcodice_1 から codice_2 の空間を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) への移行が進んでいる。
IBM PCやXT時代には組込のユーザーインタフェースはなくディップスイッチを用いて設定したが、80286 CPU登場以降のIBM PC互換機では不揮発性BIOS実装メモリー(CMOS RAM チップ)に設定を記憶するようになった。ビデオアダプタのタイプ、メモリーサイズ、ハードディスクのパラメータなどはROMの組込ではなく「リファレンスディスケット」で設定できるようになった。
80386世代以降のコンピュータではBIOSセットアップユーティリティをBIOS自身に組み込みむようになり、一般に、起動時に "Press F1 to enter CMOS Setup." のような表示が出る間に特定のキーを押すことでメニューに入ることができ、押すキーは機種によって異なっている。BIOSのUIでは
などを設定することが出来る。
近年のPCでは起動時のハードウェア初期化で多くの項目に自由度があり、設定内容の一部をユーザーが指示できるようになっている。この場合VGA BIOSなどが正常に起動したあと、特定のキー操作でメニュー形式で画面上に項目を表示することができ、キーボードを使って設定内容を編集し、終了時にバッテリバックアップされたレジスタに保存することができる。編集画面で以前とは異なった内容を保存した場合は、その新たなメモリ内容でハードウェアの初期化が開始される。また次回以降の起動時にこのメモリの内容にしたがってハードウェアが初期化される。このパラメータ設定を行うソフトウェアや設定画面を BIOS Setup（バイオスセットアップ）と呼び、CMOS Setup（シーモスセットアップ）とも通称される。
プラグアンドプレイは、ハードウェアのメモリマップや割り込み要求信号 (IRQ) をプログラマブルに変更できる機能で、従来はジャンパーピンなどで設定していたものを、BIOSプログラムが起動時に一定の手順で自動的に設定するものである。BIOSのパラメータ設定を容易にするために登場した機構であるが、ISAのPnPデバイスでは一部不完全で問題が発生することがあり、手動で設定が必要な場合がある。その際に、設定を変更するにもメニュー設定画面表示までBIOS起動が進行しないことがあり、そうなると問題解決はかえって複雑になる。
マザーボードリソースの設定も、動作クロックや電源電圧といったハードウェアに密接した設定もメニューから変更可能な場合がある。基本的には自動設定もしくは初期値が適切な値をとるが、自動での設定がうまくいかない場合等に備え、任意の設定を行うことも可能にしてあるものもある。中にはハードウェアの定格動作に反するオーバークロックといった仕様に基づいた設定としては不適切な状態にすることも可能であり、その設計マージンや個体差によって、起動できない状況も発生する場合もある。それが設定の範疇と故障を起こさないものであれば、後述のように設定を初期値に戻すことで、再度起動する状態に戻すことが可能である。
PCトラブルの際に、BIOSの可変設定部分を初期状態に戻す事で解決するケースがある。
マザーボードのBIOSバックアップ用電池をいったん外し、しばらく待ってから（30秒〜1分）電池を入れなおすことで設定が初期化される。確実を期すなら、外した電池を戻す前に電池ホルダのプラス極とマイナス極を金属（例えばピンセット）で短絡させるのが良い。あるいは、マザーボードによってはBIOS初期化のリセットスイッチや、ジャンパポストが装備されている。またBIOSによってはメニュー内から初期化機能を持っているものがある。
この行為は、「CMOSクリア」と通称されている。また、しばしば誤って「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は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 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マザーボードに採用されている。