ベアメタル

ベアメタル（）とは、計算機科学では、オペレーティングシステム (OS) を介さずに、ロジックハードウェア上で直接命令を実行するコンピュータを指す。ベアマシン（）とも呼ばれる。bareとは「裸」のことで、OS等の「衣」を纏っていない、という意味。

最新のOSは、初歩的なものから現在の複雑で感度の高いシステムまで、さまざまな段階を経て進化し、多くのサービスが組み込まれている。プログラム可能なコンピュータの開発後（異なるプログラムの実行に物理的変更を必要としない）、OSの開発前は、システムソフトウェアレイヤーなしで機械語を使用してコンピュータハードウェア上で直接順番に命令が実行された。このアプローチは、最新のOSの「ベアマシン」の前身と呼ばれている。今日では、ベアメタル方式はタイムクリティカルな遅延要件を持つ組み込みシステムとファームウェアで使われる。一方、従来のプログラムはOS上のランタイムシステムによって実行される。

長所 
ベアメタル実装はより高速に実行でき、使用するメモリが少なくなるため、電力効率が向上する。これは、他のプログラムと同様にOSを実行するには、実行時間とメモリスペースが必要であり、ベアメタルではこれらが不要であるためだ。たとえば、入力と出力を含むハードウェア機能は、ベアメタルでは直接アクセスするが、OSを使用する場合は、呼び出しをサブルーチンにルーティングする必要があり、そこで追加の実行時間とメモリを消費する。

短所 
ベアメタルプログラミングは、より多くの労力を必要とし、より複雑になる。通常は、OSがハードウェアとの間を取り持つため意識しなくても済んでいたサービスを、アプリケーション自身が再実装する必要があるためである。

実装すべきサービスには次のものがある。

 システムの起動（必須）。
 メモリ管理：ハードウェアリソースと周辺機器に関するコードとデータの保存場所（必須）。
 中断処理（ある場合）。
 アプリケーションが複数のタスクを実行できる場合のタスクスケジューリング。
 周辺機器の管理（ある場合）。
 エラー/障害管理（必要に応じて）。

ベアメタルプログラムのデバッグは、次の理由で困難である。

 ソフトウェアエラー通知や障害管理は、実装しない限り、存在しない。
 標準出力は、実装しない限り、存在しない。
 プログラムが書き込まれるマシンは、プログラムが実行されるマシンと同じにできないため、エミュレータ/シミュレータ、外部デバイスのいずれかをターゲットハードウェアとして使うことになる。ベアメタルプログラムをターゲットにロードする方法（フラッシング）を設定し、プログラムの実行を開始して、ターゲットリソースにアクセスする、という複雑な手順を踏む必要がある。

ベアメタルプログラミングは、一般に、C++ 、C言語、またはアセンブリ言語などのハードウェアに近い低級言語を使用して実行される。これらの言語は、一般的に習得が難しいと考えられている。以上により、ベアメタルプログラムの移植性は総じて低くなる。

例

初期のコンピュータ 
PDP-11などの初期のコンピュータでは、プログラマはマシンコードで提供されるプログラムをRAMにロードしていた。プログラムの動作はLEDの点灯や、磁気テープ、印刷デバイス、またはストレージから得られる出力によって監視できた。

組み込みシステム 
ベアマシンプログラミングは、マイクロコントローラまたはマイクロプロセッサが、個別のOSをロードせずに、モノリシックな単一目的のソフトウェアで直接起動することが多い組み込みシステムでは、依然として一般的な方法である。このような組み込みソフトウェアは構造が異なる場合があるが、最も単純な形式は、入力のチェック、アクションの実行、および出力の書き込みを担当するサブルーチンの呼び出し、無限のメインループで構成されている。

進化 
ベアマシンを使用するというアプローチは、OS開発の進化を加速する新しいアイデアへの道を開いた。

このアプローチは、以下の必要性を浮き彫りにした。

 コードとデータの両方を便利に入力するための入出力（I/O）デバイス：
 キーボードなどの入力デバイスが作成された。以前のコンピュータには、独特で鈍い、複雑な入力デバイスがしばしばあったため、これらは必要だった。 たとえば、プログラムは、デバイスのフロントパネルにある一連のトグルスイッチを使用して、手動でPDP-11にロードされた。キーボードは、トグルスイッチを使用してマシンに入力するよりもコードやデータを入力する方がはるかに高速であるため、これらの旧来の入力デバイスよりもはるかに優れている。キーボードは、ブランドや価格に関係なく、ほとんどすべてのコンピュータで標準になった。
 コンピュータモニターなどの出力デバイスは、後に広く使用されるようになり、現在でも使用されている。これらは、 Altair 8800の表示用LEDなど、コンピュータの状態を示す以前の出力デバイスよりも非常に便利であることが証明された。 コンピュータモニターは、プログラムの出力をユーザーフレンドリーな方法で簡単に表示することもできる。たとえば、コンピュータのハードウェアの状態を理解し始めるには、特定のコンピュータと、表示用LEDで構成されるその表示システムについての知識が必要となる。対照的に、誰でも、プログラムが実行されているコンピュータのハードウェアについて何も知らなくても、最新のシステムで適切に設計されたユーザインタフェースを理解できるはずである。
 プログラムを不揮発性メモリに保存するための、より高速で、より安価で、より広く利用可能なセカンダリストレージデバイス。これが必要だったのは、コンピュータを便利な方法で使用するために手でコードを入力する必要があり、システムが揮発性メモリに保存するために再起動するたびに失われるため。
 便利な高級言語と、そのような高級言語を対応する機械語に翻訳するための要件。
 ライブラリモジュールをリンクするためのリンカー。ユーザーが作成したもの、またはシステムですでに使用可能なもの。
 実行可能ファイルをセカンダリストレージからRAMにロードするローダー。
 プログラムによって生成された出力のハードコピーを作成するためのプリンターなどの適切なI/Oデバイス。

関連項目 

 ベアメタルハイパーバイザ
 ベアメタルサーバ
 ベアマシンコンピューティング
 ベアボーンキット
 スタンドアロンプログラム

脚注 

 

オペレーティングシステム
ソフトウェアの歴史
計算機の歴史