ベアメタル
ベアメタルプログラミングは、より多くの労力を必要とし、より複雑になる。通常は、OSがハードウェアとの間を取り持つため意識しなくても済んでいたサービスを、アプリケーション自身が再実装する必要があるためである。
実装すべきサービスには次のものがある。
システムの起動(必須)。
メモリ管理:ハードウェアリソースと周辺機器に関するコードとデータの保存場所(必須)。
中断処理(ある場合)。
アプリケーションが複数のタスクを実行できる場合のタスクスケジューリング。
周辺機器の管理(ある場合)。
エラー/障害管理(必要に応じて)。
ベアメタルプログラムのデバッグは、次の理由で困難である。
ソフトウェアエラー通知や障害管理は、実装しない限り、存在しない。
標準出力は、実装しない限り、存在しない。
プログラムが書き込まれるマシンは、プログラムが実行されるマシンと同じにできないため、エミュレータ/シミュレータ、外部デバイスのいずれかをターゲットハードウェアとして使うことになる。ベアメタルプログラムをターゲットにロードする方法(フラッシング)を設定し、プログラムの実行を開始して、ターゲットリソースにアクセスする、という複雑な手順を踏む必要がある。
ベアメタルプログラミングは、一般に、C++ 、C言語、またはアセンブリ言語などのハードウェアに近い低級言語を使用して実行される。これらの言語は、一般的に習得が難しいと考えられている。以上により、ベアメタルプログラムの移植性は総じて低くなる。