フリースタンディング環境とは
フリースタンディング環境とは、
C言語および
C++におけるプログラム実行環境の一種で、
オペレーティングシステム(OS)の存在を前提としない環境を指します。これは、国際標準規格ISO/IEC 9899(
C言語)およびISO/IEC 14882(
C++)で規定されています。対義語として、OSの存在を前提とするホスト環境があります。
概要
フリースタンディング環境は、主に以下のような状況で利用されます。
組み込みシステム:家電製品や産業機器など、特定の機能に特化したコンピュータシステム
OS自体:カーネルなど、OSの中核部分
これらの環境では、OSが提供する機能を利用できないため、プログラムはハードウェアを直接制御する必要があります。一方、ホスト環境は、一般的な
アプリケーションソフトウェアや
ミドルウェアが動作する環境で、OSが提供する豊富な機能を利用できます。
フリースタンディング環境向けに作成されたプログラムは、必ずしもOSなしで動作する必要はありません。デモシーン用のプログラムのように、OS上で動作するフリースタンディング環境のプログラムも存在します。
実行環境が明示されていない場合、一般的にはホスト環境を対象としていることが多いですが、
組み込みシステムではフリースタンディング環境が対象となることがあります。また、μITRONのようなリアルタイムOSの中には、フリースタンディング環境を選択できるものもあります。
ホスト環境との違い
フリースタンディング環境とホスト環境の主な違いは、以下の点にあります。
OSの有無: フリースタンディング環境はOSが存在しない、またはOSの機能をほとんど利用できない環境です。一方、ホスト環境はOSの存在を前提とし、OSが提供する豊富な機能を利用できます。
標準ライブラリ: フリースタンディング環境では、標準Cライブラリのうち、利用できる関数が制限されます。
C++では、言語機能を実装するために必要な最低限のライブラリのみが提供されます。
C言語では、ヘッダーファイルのみが要求されます。
エントリーポイント: ホスト環境では、プログラムの開始点として `main` 関数が使われますが、フリースタンディング環境では `main` 関数である必要はなく、処理系によって定義された関数が利用されます。これは、`main`関数がOSの存在を前提としているためです。
メモリ領域:フリースタンディング環境は、ホスト環境よりもメモリ領域が狭い環境を想定しています。
制限
フリースタンディング環境では、以下の制限があります。
エントリーポイント: `main` 関数である必要はなく、関数の型と名称は処理系定義となります。例えば、GCCではデフォルトで `void _start(void)` が利用されます。
標準Cライブラリ: 標準Cライブラリの大部分はサポートされません。サポートされる標準ライブラリは、Cのバージョンによって異なります。
C89: `float.h`, `limits.h`, `stdarg.h`, `stddef.h`
C95: C89のライブラリに加え `iso646.h`
C99: C95のライブラリに加え `stdbool.h`, `stdint.h`
C11:
C99のライブラリに加え `stdalign.h`, `stdnoreturn.h`
*
C++03: `exception`, `limits`, `cstdarg`, `cstddef`, `cstdlib` (abort, atexit, exitのみ), `new`, `typeinfo`
例
フリースタンディング環境での簡単なプログラム例を以下に示します。
c
include
void _start(void) {
char message[] = "Hello, freestanding world!
";
write(1, message, sizeof(message) - 1);
_exit(0);
}
このプログラムは、GCCと
Linuxの組み合わせで動作し、`-ffreestanding`, `-nostartfiles`, `-static` オプションでコンパイルします。`exit` 関数は標準ライブラリの一部で、フリースタンディング環境では使用できませんが、`_exit` 関数はシステムコールを直接呼び出すため、使用できます。
標準Cライブラリなし
フリースタンディング環境に加えて、コンパイラによっては、標準Cライブラリを全く使用せずにコンパイルすることもできます。例えば、GCCでは、`-nostdlib` オプションを指定することで、標準Cライブラリの使用を禁止できます。この場合、プログラムはOSのシステムコールを直接呼び出して終了処理を行う必要があります。例えば、
Linuxでは、 `_exit` システムコールを呼び出すことでプログラムを終了できますが、アセンブリ言語で記述する必要があります。
c
void _start() {
const char message[] = "Hello, no stdlib world!
";
//
Linux x86-64 system call for write
__asm__(
"mov $1, %%rax
"
"mov $1, %%rdi
"
"mov %0, %%rsi
"
"mov %1, %%rdx
"
"syscall
"
:: "r"(message), "r"(sizeof(message) - 1) : "rax", "rdi", "rsi", "rdx"
);
//
Linux x86-64 system call for exit
__asm__(
"mov $60, %%rax
"
"xor %%rdi, %%rdi
"
"syscall
"
: : : "rax", "rdi"
);
}
このプログラムは、GCCと
Linux、x86-64の組み合わせで動作し、`-nostdlib`, `-fno-builtin`, `-static` オプションでコンパイルします。
まとめ
フリースタンディング環境は、
組み込みシステムやOSなど、OSの存在を前提としない環境でプログラムを開発する際に重要な概念です。標準ライブラリやエントリーポイントに制限があるため、ホスト環境とは異なる考慮が必要です。また、標準ライブラリを全く使用せずに開発することも可能です。プログラムの動作環境を正しく理解することで、より効率的で信頼性の高いソフトウェア開発が可能になります。