Linux のコンテキストでは、ブート ローダーはいくつかの事前定義されたタスクを担当します。この質問にはアームタグが付けられているので、ARM ブートは役立つリソースになると思います。具体的には、ブートローダーが ATAG
の設定を担当していました/担当しています RAM の量、カーネル コマンド ライン、およびその他のパラメータを記述したリスト。最も重要なパラメータの 1 つは、マシン タイプです。 . デバイス ツリーを使用 、ボードの完全な説明が渡されます。これにより、ストック ARM Linux は、説明されているようにパラメーターを設定するためのコードがないと起動できなくなります。
パラメータは 1 つの generic を許可します 複数のデバイスをサポートする Linux。たとえば、ARM Debian カーネルは何百もの異なるボード タイプをサポートできます。 Uboot または他のブートローダーがこの情報を動的に決定するか、ボード用にハードコードすることができます。
スタック オーバーフローのブートローダー情報ページもご覧ください。
基本的なシステムは ATAGS
をセットアップできるかもしれません NOR フラッシュを SRAM にコピーします。ただし、通常はこれよりも少し複雑です。 Linux では RAM のセットアップが必要なため、SDRAM コントローラーを初期化する必要がある場合があります。 NAND フラッシュを使用する場合、不良ブロックを処理する必要があります そしてコピー memcpy()
よりも少し複雑かもしれません .
Linux には、ドライバがクロックが初期化されていると想定する潜在的なドライバ バグが存在することがよくあります。たとえば、Uboot の場合 は常に特定のマシンのイーサネット クロックを初期化しますが、Linux イーサネット ドライバがこのクロックの設定を怠っている可能性があります。これは、特にクロック ツリーに当てはまります。
一部のシステムでは、Linux でサポートされていないブート イメージ形式が必要です。たとえば、ハードウェアをすぐに初期化できる特別なヘッダー。 devices
の設定のように から初期コードを読み取ります。さらに、多くの場合、すぐに構成する必要があるハードウェアがあります。 ブートローダー これは迅速に実行できますが、Linux の通常の構造ではこれが大幅に遅れて I/O 競合などが発生する可能性があります。
実用的な観点からは、ブートローダーを使用する方が簡単です。ただし、Linux のソースをそこから直接起動するように変更することを妨げるものは何もありません。 ブートローダーを貼り付けるようなものかもしれませんが Linux の先頭に直接コードを追加します。
関連項目:Coreboot、Uboot、Wikipedia の比較。 Barebox はあまり知られていませんが、適切に構造化された最新の ARM 用ブート ローダーです。 RedBoot は一部の ARM システムでも使用されています。 RedBoot パーティションはカーネル ツリーでサポートされています。
<ブロック引用>
ブート ローダーは、セルフテストの完了後にコンピューターのメイン オペレーティング システムまたはランタイム環境を読み込むコンピューター プログラムです。
^ ウィキペディアの記事より
したがって、基本的にブートローダーは、フラッシュからオペレーティングメモリにデータをコピーするという、まさにあなたが望むことを行っています。とてもシンプルです。
OS のブーストストラップについて詳しく知りたい場合は、リンク先の記事を読むことを強くお勧めします。ブート フェーズは、テストとは別に、周辺機器やその他のチェックも含まれます。それらをスキップすることは、非常に単純な組み込みデバイスでのみ意味があります。そのため、ブートローダーはさらに単純です:
<ブロック引用>一部の組み込みシステムは、機能を開始するために顕著なブート シーケンスを必要とせず、電源を入れると、ROM に保存されている操作プログラムを実行するだけです。
同じソース
<ブロック引用>
ブートローダなしでカーネルをフラッシュメモリから RAM に直接ロードできないのはなぜですか?ロードするとどうなりますか?実際、プロセッサはそれをサポートしていませんが、なぜ手順に従っているのですか?
Bartek、Artless、および Felipe はすべて、全体像の一部を示しています。
すべての組み込みプロセッサ タイプ (E.G. 386EX、Coretex-A53、EM5200) は何かを行います リセットまたは電源投入時に自動的に。時々その何か 電源を入れ直すか、デバイスをリセットするかによって異なります。一部の組み込みプロセッサでは、その何かを変更できます デバイスの電源投入時またはリセット時にさまざまなピンに印加される電圧に基づいています。
とにかく、限られた量の何かがあります その何かを定義するために必要なプロセッサ上の物理スペースのために、プロセッサが実行できること 、オンチップ FLASH、命令マイクロコード、またはその他のメカニズムのいずれであっても。
この制限は、何か です
- 目的を明確にし、1 つのことをできる限り迅速に行う
- 範囲と機能に制限があり、通常は小さなコード ブロック (多くの場合、数キロバイト以下) を固定メモリ位置に読み込み、読み込まれたコードの先頭から実行します。
- 変更不可
そのため、リセットまたは電源の再投入に応じてプロセッサが行うことは変更できず、あまり行うこともできません。数百メガバイトまたはギガバイトを、存在しないか初期化されていない可能性のあるメモリに自動的にコピーすることは望ましくありません。これには長い時間がかかります。
だから....
使用するすべてのデバイスで許可されている最小サイズよりも小さい小さなプログラムをセットアップします。そのプログラムは何かのどこにでも保存されます
小さなプログラムが U-Boot の場合もあります。 U-Boot でさえ最初の読み込みには大きすぎる場合があるため、小さなプログラムが次に U-Boot を読み込みます。
ポイントは、something によって読み込まれるものは何でもあるということです。 、変更可能です 特定のシステムの必要に応じて。 U-Boot の場合は素晴らしいですが、そうでない場合は、メインのオペレーティング システムをロードする場所や U-Boot (またはその他のブートローダー) をロードする場所を認識しています。
次に、U-Boot (一般的にブートローダーについて言えば) は、最小限のデバイス、メモリ、チップ設定などを構成して、メイン OS をロードして起動できるようにします。メイン OS init は、追加の構成または初期化を処理します。
したがって、シーケンスは次のとおりです。
- プロセッサーの電源投入またはリセット
- 何か 初期ブート コード (または U-Boot スタイルの組み込みブートローダー) を読み込みます
- 初期ブート コード (不要な場合があります)
- U-Boot (またはその他の一般的な組み込みブートローダー)
- Linux 初期化
プライマリ ブートローダは通常、シリコンに組み込まれており、システムで実行される最初の USER コードのロードを実行します。
チップに依存するため、最初のコードをロードするための標準化されたプロトコルがないため、ブートローダーが存在します。場合によっては、シリアル ポート、フラッシュ メモリ、またはハード ドライブを介してコードを読み込むこともできます。それを見つけるのがブートローダー機能です。
ユーザー コードが読み込まれて実行されると、ブートローダーは使用されなくなり、システム実行の正確性はユーザーの責任になります。
組み込み Linux チェーンでは、プライマリ ブートローダーが Uboot をセットアップして実行します。次に、Uboot が Linux カーネルを見つけてロードします。