7

私はマイクロコントローラープログラミングを始めた初心者です。ここで注目しているチップは、cortex-a9 です。リセットまたは電源投入時に、読み取り値から 0x0000000 にコードが必要です。些細すぎるように聞こえるかもしれませんが、私の質問は、いくつかの概念を大局的に捉えるのに役立ちます。

メモリ アドレス 0x0000000 は ROM にありますか? そのアドレスからコードが読み取られた直後に何が起こるでしょうか? ある種のブートローダーが存在する必要がありますか?存在する場合、これはどのアドレスにあるべきですか?ROMにも存在する必要がありますか? 最後に、カーネルはどの時点で起動し、カーネル コードはどこにあるのでしょうか?

4

2 に答える 2

6

ハードウェアが実行を開始するアドレスでブート コードを使用できるようにする必要があります。

これは通常、ハードウェアがある種のフラッシュまたはブート ROM をブート アドレスにマップし、そこから実行を開始することによって実現されます。

マイクロコントローラーでは、起動時に実行を開始するコードの寿命はかなり厳しいことに注意してください-ハードウェアはまだ初期化されておらず、ハードウェアがないということは、RAMへのアクセスを制御するDDRコントローラーでさえまだ機能していないことを意味します...したがって、コードは RAM なしで実行する必要があります。

最初のブート コードでハードウェアを十分に設定した後 (たとえば、RAM チップの設定、TLB の設定、MAC のプログラムなど) を実行すると、ブートローダーが実行されます。

一部のシステムでは、初期ブート コードはブート ローダーの最初の部分にすぎません。一部のシステムでは、専用のブート コードが設定を行い、フラッシュからブート ローダーを読み取って実行します。

ブートローダの仕事は、カーネル/OS のイメージを、通常はフラッシュまたはネットワークから RAM に取り込むことです (まれですが、別のボードや PCI バスなどとメモリを共有することもできます)。ブート ローダーがカーネル/OS バイナリのイメージを RAM に格納すると、必要に応じて圧縮を解除し、カーネル/OS イメージの開始アドレスを制御 (呼び出し) します。

場合によっては、カーネル/OS イメージが、実際には圧縮されたカーネルの小さなデコンプレッサおよびブロブであることがあります。

いずれにせよ、最終的な結果として、カーネル/OS は RAM で利用可能になり、ブートローダーは、オプションでピギーバック圧縮解除プログラムを介して制御を渡します。

その後、カーネル/OS が実行を開始し、OS が起動します。

于 2011-07-16T07:44:58.540 に答える