Basic Input/Output System

Basic Input/Output System（ベーシック インプット/アウトプット システム、頭字語：BIOS（バイオス））とは、ファームウェアの一つで、コンピュータに搭載されたプログラムのうち、ハードウェアと最も低レベルな入出力を行うためのプログラムである。

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

概要
BIOSはパーソナルコンピュータ(PC)に組み込まれており、電源投入と同時に実行される。ハードウェアを初期化し補助記憶装置からブートローダーを呼び出す。またキーボードやディスプレイなどの入出力装置をプログラムから利用するためのサービスを提供する。プログラムはハードウェアに直接アクセスするのではなく、これらサービスを利用する事でハードウェア差を気にしなくて良くなる。ただし近代的なオペレーティングシステム (OS) はこの抽象化層を使用せず、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) に移行されている。UEFIはBIOSの技術的問題に対処することを目的とした後継である。

用語と歴史

ゲイリー・キルドールが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" と呼ぶ場合がある（一般にCP/M対応機のROMには簡素なブートローダーしかない）。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

あるアダプタカードがブート時に必須でありかつシステムBIOSがこれをサポートしていない場合、オプションROMが必要となる。また、オプション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がないかメモリ空間の末尾までサーチを進め、見つけた順に呼び出す動作を繰り返す。

BIOSに分類されるプログラム
VGA BIOS
ビデオサブシステム（主にテキストと低解像度グラフィクス）
VESA BIOS
ビデオサブシステム（SVGAグラフィクス）
SCSI BIOS
ディスクI/Oサブシステム（拡張SCSIもこの形態をとる）
APM BIOS
初期のパワーマネジメントシステム。後に改良されてACPI BIOSの一部となる。
PCI BIOS
I/Oサブシステム。後にACPI BIOSの一部となる。
ACPI BIOS
パワーマネジメントシステム及びI/Oサブシステム
SMBIOS
システムマネジメントBIOS。BIOS内のデータ構造の配置・アクセス方法の規格。SMBIOSを参照。

オペレーティングシステムサービス

プロセッサのマイクロコード更新
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 チップ)に設定を記憶するようになった。

80386世代以降のコンピュータではBIOSセットアップユーティリティをBIOS自身に組み込みむようになり、一般に、起動時に "Press F1 to enter CMOS Setup." のような表示が出る間に特定のキーを押すことでメニューに入ることができ、押すキーは機種によって異なっている。BIOSのUIでは
 ハードウェアの設定
 システム時刻の設定
 システム内コンポーネントの有効化/無効化
 ブートさせるデバイスの選択
 BIOS設定を保護するパスワード画面、承認されていない記憶デバイスの挿入による起動の防止
などを設定することが出来る。

近年のPCでは起動時のハードウェア初期化で多くの項目に自由度があり、設定内容の一部をユーザーが指示できるようになっている。この場合VGA BIOSなどが正常に起動したあと、特定のキー操作でメニュー形式で画面上に項目を表示することができ、キーボードを使って設定内容を編集し、終了時にバッテリバックアップされたレジスタに保存することができる。編集画面で以前とは異なった内容を保存した場合は、その新たなメモリ内容でハードウェアの初期化が開始される。また次回以降の起動時にこのメモリの内容にしたがってハードウェアが初期化される。このパラメータ設定を行うソフトウェアや設定画面を BIOS Setup（バイオスセットアップ）と呼び、CMOS Setup（シーモスセットアップ）とも通称される。

プラグアンドプレイは、ハードウェアのメモリマップや割り込み要求信号 (IRQ) をプログラマブルに変更できる機能で、従来はジャンパーピンなどで設定していたものを、BIOSプログラムが起動時に一定の手順で自動的に設定するものである。BIOSのパラメータ設定を容易にするために登場した機構であるが、ISAのPnPデバイスでは一部不完全で問題が発生することがあり、手動で設定が必要な場合がある。その際に、設定を変更するにもメニュー設定画面表示までBIOS起動が進行しないことがあり、そうなると問題解決はかえって複雑になる。

マザーボードリソースの設定も、動作クロックや電源電圧といったハードウェアに密接した設定もメニューから変更可能な場合がある。基本的には自動設定もしくは初期値が適切な値をとるが、自動での設定がうまくいかない場合等に備え、任意の設定を行うことも可能にしてあるものもある。中にはハードウェアの定格動作に反するオーバークロックといった仕様に基づいた設定としては不適切な状態にすることも可能であり、その設計マージンや個体差によって、起動できない状況も発生する場合もある。それが設定の範疇と故障を起こさないものであれば、後述のように設定を初期値に戻すことで、再度起動する状態に戻すことが可能である。

設定初期化（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、後年にはフラッシュメモリ（主にNORフラッシュ）などの再プログラム可能なデバイスを採用するようになった。

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マザーボードに採用されている。

脚注

関連項目 

 ブート
 Unified Extensible Firmware Interface (UEFI)
 Unified EFI Forum (UEFI Forum)
 Power On Self Test
 NTLDR
 Windows Boot Manager

ファームウェア
ブート