11

組み込みシステムにおけるブートローダーとスタートアップ コードの基本的な意味は何ですか? 違いはなんですか?

これらはどこに置かれていますか?? そして、パワーオンリセットからアプリ起動までの流れの概要です。一般的にあらゆるプラットフォームを考慮します。

4

1 に答える 1

69

すべてのプロセッサには、プロセッサ固有の開始方法があります。通常、プロセッサのアドレス空間にはいくつかのアドレスがあります。たとえば、プロセッサがそのメモリを読み取る0xFFFF0000としましょう。見つかった値をコードのアドレスとして使用し、そのアドレスでコードの実行を開始します。

チップまたはボードの設計者がハードウェアで行うことは、フラッシュまたはその他の形式の不揮発性メモリ (ROM) がそのアドレス空間にマップされていることを確認することです。アドレスは、電源がオンになってリセットが解除されたときにプロセッサが読み取るためにそこにあります (RAM は揮発性で、電源をオフにするとデータが失われ、電源をオンに戻すとランダムなデータが得られるまで、 RAMは何か他のもので書かれています)。

そのため、プロセッサが最初に実行するコードはブートローダーと呼ばれることが多く、ローダーという単語の後半部分は、このコードがオペレーティング システムまたは実行するアプリケーションを「ブート」できること、および 2 番目のコードとしても実行できることを意味すると議論する人もいるかもしれません。関数は、開発者に「ローダー」機能を提供します。U-BootGRUB 、または他の多くのブートローダーを使用したことがある場合は、何も触らなければ、組み込みアプリケーションやオペレーティング システムなど、デフォルトのものを起動することを理解できます。

ただし、ブート プロセスを中断する場合、そのプロセスの中断はプラットフォームとソフトウェアに非常に固有のものであり、ボタンを押すか、2 つのピンを一緒に短絡するか、シリアル/ UARTポートでエスケープまたはその他の文字を送信する必要がある場合があります。 .、そして、ブートするものを変更したり、フラッシュ/ROMからデフォルトのプログラムをロードするブートローダーの代わりに、XMODEMZMODEM、イーサネットポートなどを使用したりできるローダモードに入ります。プロトコルを使用してテスト プログラムを RAM にロードし、デフォルト プログラムの代わりにそのプログラムを実行できるようにします。

一部の人々は、プロセスを中断して代替プログラムをロードすることを許可しない場合でも、ブート ソフトウェアをブートローダーと呼んでいます。これは、ブート コードが非揮発性ストレージからアプリケーションを RAM に「ロード」している可能性があるためです。

すべてのブートローダーがアプリケーションを不揮発性ストレージ (フラッシュ/ROM、ハードディスク、CD-ROM など) から RAM にコピーする必要があるわけではありません。一部のシステムおよび一部のアプリケーションは、フラッシュ/ROM から実行されます。PC の例: PC の実際のブートローダーは、フラッシュ/ROM に存在し、そこから実行されるプログラムである BIOS です。PC のようなDRAMを搭載したシステムの場合は、とにかく DRAM システムを起動する必要があります。DRAM が機能するようにハードウェアを構成するには、多くのコードが必要であり、PC の起動時にモニターでこの状況を確認できる場合があります。システムにSRAMがある場合は、初期化が必要になる場合もありますが、通常は DRAM ほど複雑ではなく、多くの場合、構成をほとんどまたはまったく行わずにすぐに起動して使用する準備が整います。異なるプロセッサと異なるシステムは...異なります。 .

そのため、プロセッサ ハードウェアに何らかの方法でハードコードされているため、プロセッサはリセットされていません。ブート コードへのエントリ ポイントを検出し、そのコードの実行を開始しました。そのコードは一般に、周辺機器と RAM を起動して実行し、メイン アプリケーションを実行する必要があります。または、そのアプリケーションを開始する前に、少なくとも同程度のハードウェアが必要です。

組み込みシステムに Linux をロードすることは、RAM を準備し、カーネルを ROM から RAM にコピーし、おそらくいくつかのレジスタを準備し、おそらくメモリ サイズと代替コマンド ラインでカーネルが参照するいくつかのメモリ ロケーションを埋めるのと同じくらい簡単です。たとえば、カーネルの先頭に分岐します。一部のシステムではカーネルをコピーする必要はありません。それが存在するROMに分岐するだけです。その後、Linux はシステムの残りの部分を起動します。PC では、BIOS はビデオ、DRAM の起動、 PCIの列挙など、多くのことを行います。(e) 周辺機器をバス接続し、ハードディスクまたはその他のファイルシステムのようなデバイスを起動し、BIOS ハードディスクまたは同様の周辺機器 (USB サムドライブまたは CD-ROM など) でユーザーが定義したものを使用します。ファイル システムの先頭には、BIOS コードの規則に基づいてオペレーティング システムを起動する方法が含まれています。そして、それはさらに別のブートローダー (GRUB、U-Boot など) である可能性があり、最終的にカーネルまたはオペレーティング システムの起動コードを RAM にコピーし、そこに分岐します...

ブートローダーとスタートアップ コードという用語は、同じ意味で使用できます。一部の人々は、それらが異なるか微妙な違いであることにうるさいかもしれませんが、それは通常、複雑さと関係があります.イーサネットドライバーとファイルシステムドライバーなどを備えたU-Bootのようなブートローダーは、ある程度、オペレーティングシステムの一部です. U-Boot は非常に複雑です。

たとえば、マイクロコントローラのスタートアップ コードは、数行のコード、スタック ポインタの設定、および main への分岐という単純なものです。また、起動コード/ブートローダーは、その間の複雑さのレベルに関係なくすることができます. すでに述べたように、一部の組み込みシステムは ROM から起動してアプリケーションを実行するため、コピーして実行する必要はありません。その他は、メイン アプリケーションのコピーと実行が必要です。

ハードウェアまたはその他のスキームが関与する場合があります。たとえば、多くのFPGAベースのソリューションでは、電源投入時にハードウェアが ROM から内容を読み取り、それをコピーすることが可能です。次に、プロセッサまたはその他のロジックが解放されると、プログラムまたはその他のデータが魔法のように RAM に存在し、すぐに使用できるようになります。電源がオフのときでも、通常は触れないROMに住んでいます。Raspberry Piには、さらに別のソリューションがあります。チップには 2 つのプロセッサがあり、1 つは ARM で、もう 1 つはGPUです。、グラフィックプロセッサ、完全に異なる命令セット、数学演算用に設計されたものなど。SDカードを起動して読み取るのに十分な小さなブートローダーが何らかの形でチップ(チップ上のROMの可能性が高い)に焼き付けられています。これは GPU BTW です。ARM がリセットされます。次に、GPU は SD カードから最初のブートローダー ファイルを読み取り、それを RAM にコピーして実行します。

そのブートローダーは、DRAM を立ち上げるなど、より多くのことを行い、より複雑な第 2 (第 3 ?) 段階のブートローダーを SD カードから DRAM にコピーして実行します。そのコードには、システムの画面/表示機能を実行するための GPU アプリケーションが含まれている可能性があります。また、ビデオとすべての準備が整うと、SD カードをもう一度読み取り、ARM アプリケーションを SD カードから DRAM にコピーし、RAM にいくつかの項目を入力します (例外テーブルのブート ベクトル (カーネルへの分岐))。 Linuxカーネルのブートコードが必要とする既知の場所にあるその他のアイテム。次に、ARM のリセットを解除します。この時点で ARM は、魔法のように RAM 内のアプリケーションであるカーネルで起動します...

于 2013-03-29T03:53:03.703 に答える