あなたが話しているのは、組み込みの世界で「ベアメタル」アプリケーションとして知られているものです。これらは、(たとえば)デビットカード検証ボックスまたはインタラクティブなおもちゃに入るARM Cortex-M3のようなもので非常に一般的であり、完全なオペレーティングシステムを実行するのに十分なメモリまたは機能を備えていません. したがって、ARM プロセッサ上の Linux で実行するアプリケーションをコンパイルする「ARM/Linux」コンパイラを取得する代わりに、オペレーティング システムなしで ARM プロセッサで実行するようにコンパイルする「ARM ベアメタル」コンパイラを取得します。(例として、x86 ではなく ARM を使用しています。これは、最近では x86 ベアメタル アプリケーションが非常にまれであるためです。)
あなたの質問と他の回答で述べたように、アプリケーションは、そうでなければオペレーティング システムによって処理されるいくつかのことを行う必要があります。
まず、メモリ システム、割り込みベクトル、およびボード グーのその他のさまざまなビットを初期化する必要があります。通常、これはベアメタル コンパイラが行うことですが、奇妙なボードを使用している場合は、その方法を伝える必要があるかもしれません。これは、ボードがオンになった時点から main() 関数が開始する時点までのものを取得します。
次に、CPU と RAM の外側にあるものと対話する必要があります。オペレーティング システムには、これを行うためのあらゆる種類の機能が含まれています。ディスク I/O、画面出力、キーボードとマウスの入力、ネットワークなどです。オペレーティング システムがなければ、別の場所から入手する必要があります。ハードウェア製造元のライブラリからその一部を入手することができます。たとえば、私が最近遊んでいたボードには 40x200 ピクセルの LED スクリーンがあり、それをオンにして個々のピクセル値を設定するコードを含むライブラリが付属していました。また、TCP/IP スタックなどを実装するためのライブラリを販売している会社もいくつかあり、ネットワーキングなどを行うためのものです。
たとえば、これにより基本的な printf を実行することさえ困難になると考えてください。オペレーティング システムを使用している場合、printf はオペレーティング システムに「この文字列をコンソールに配置してください」というメッセージを送信するだけで、オペレーティング システムはコンソール上の現在のカーソル位置を検出し、すべての作業を行ってどのピクセルを計算するかを決定します。画面上で変更する方法、およびそれらのピクセルを変更するために使用する CPU 命令。
ああ、最初にプログラムを CPU に取り込む方法を理解する必要があると言いましたか? 典型的なコンピューターには、起動時に命令をロードするプログラム可能な ROM が少しあります。x86 では、これは BIOS であり、通常、CPU を起動し、ディスプレイをセットアップし、ディスクを探し、見つけたディスクからプログラムをロードする便利なプログラムが既に含まれています。組み込みシステムでは、通常、そこにプログラムを配置します。つまり、そこにプログラムを配置する方法が必要です。多くの場合、これは、プログラムをロードする組み込みボードに物理的に接続された「デバッガー」と呼ばれるデバイスがあることを意味します。また、プロセッサを一時停止してその状態を判断できるようにすることもできます。コンピューターのソフトウェア デバッガーでプログラムを実行しているかのように、プログラムをステップ実行できます。しかし、私は脱線します。
とにかく、2 番目の質問に答えるために、作成するこの実行可能ファイルは、組み込みボードのその ROM に保存されるものです。 small) 残りをフラッシュ ドライブに保存すると、ROM 内のビットにはフラッシュ ドライブから残りの部分を取得するための命令が含まれます。メイン コンピューター (つまり、作成している Linux または Windows コンピューター) にファイルとして保存される可能性がありますが、それは単なる保存用であり、そこでは実行されません。
これらのライブラリがたくさんある場合、それらはオペレーティング システムが行うことのかなりの部分を実行していることに気付くでしょう。ライブラリの山と実際のオペレーティング システムの間には、このようなスペースがあります。その領域には、RTOS と呼ばれるもの、つまり「リアルタイム オペレーティング システム」が登場します。これらの小さなものは、実際にはすべてのオペレーティングシステムのことを行うために連携して動作するライブラリのコレクションにすぎず、複数のスレッドを一度に実行できるようにするものも含まれている場合があります (そして、異なるスレッドを異なるプログラムのように動作させることができます) - -ただし、これらはすべて同じコンパイル済み「プログラム」にコンパイルされており、RTOS は実際には、インクルードしたライブラリにすぎません。より大きなものは、コードの一部を別々の場所に保存し始めます。Windows や Linux がプログラムを実行するときと同じように、ディスクからコードの断片を読み込むことさえできるものもあると思います。これは、どちらかまたは両方ではなく、一種の連続体です。
FreeRTOS システムはオープンソースの RTOS であり、RTOS スペースの小さな端に向かっています。あなたがもっと興味を持っているなら、彼らはこれのいくつかを見るのに良い場所かもしれません. x86 アプリケーションの例がいくつかあります。これにより、ベアメタルまたは RTOS ベースのプログラムを実行する x86 システムの種類と、x86 システムで実行するために何かをコンパイルする方法についてのアイデアが得られます。リンクはこちら: http://www.freertos.org/a00090.html#186 .