2011-07-16 36 views
6

私はマイクロコントローラプログラミングで初心者です。ここのチップはcortex-a9です。リセットまたは電源投入時には、私の読み取り値から0x0000000のコードがなければなりません。あまりにも些細なことに聞こえるかもしれませんが、私の質問は、いくつかの概念を見据えて私を助けます。cortex a9のブートとメモリ

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

答えて

6

ハードウェアの実行が開始されるアドレスでブートコードを入手する必要があります。

これは通常、ハードウェアがブートアドレスにフラッシュまたはブートROMのいくつかの並べ替えをマッピングし、そこから実行を開始させることによって達成されます。

ブート時に実行を開始するコードは、ハードウェアがまだ初期化されておらず、ハードウェアがないため、RAMへのアクセスを制御するDDRコントローラがまだ動作していないことを意味します。 ..あなたのコードはRAMなしで実行する必要があります。

初期ブートコードは、ハードウェアの十分を設定した後

あなたはブートローダの実行を持っている(例えばのTLBなど、プログラムのMACなどの設定、RAMチップを設定します)。いくつかのシステムでは

、初期ブートコードは、ブートローダーのほんの最初の部分です。いくつかのシステムでは、専用のブートコードが何かを設定してから、フラッシュからブートローダを読み込んで実行します。

ブートローダーの仕事は、カーネル/ OSのイメージを通常はフラッシュまたはネットワークからRAMに持ち込むことです(ただし、これはまれですが他のボードやPCIバスなどと共有することもできます) 。ブートローダーがRAMにカーネル/ OSバイナリのイメージを持っていれば、それを解凍してカーネル/ OSイメージの開始アドレスを制御(呼び出し)することができます。

はいつか、カーネル/ OSイメージは、実際には小さなデコンプレッサと、圧縮カーネルのブロブです。最終結果は、カーネル/ OSは、RAM及びブートローダーで利用可能であることである任意のレートで

、任意にピギーバックを介して減圧装置は、それにコントロールを通過しました。

次に、カーネル/ OSが起動し、OSが起動します。

8

ARMはチップではなくコアを販売していますが、そのアドレスにあるものはARMコアを購入しチップに入れるチップベンダーによって異なります。実装は、ベンダごとに、チップごとに異なります。

伝統的にARMは、より正確にリセット例外ベクタは、アドレスゼロであり、アドレスゼロから起動します。他のプロセッサフ​​ァミリと異なり、従来のARMモデルは例外エントリポイントのアドレスリストではありませんが、代わりにARMがそのアドレスで命令を実行します。つまり、相対分岐命令またはload pc命令を使用する必要があります。 thumb/thumb2のみ(ARM(32ビット)命令を実行できない)の最新のcortex-mシリーズは、従来の(ARM以外の)アドレスのようなリストを使用し、ゼロアドレスは例外ベクトルではありません。スタック・ポインタにロードするアドレス、次に2番目のエントリがリセットされます。また、cortex-m例外リストは異なります。そのファミリには、従来のARMに2つの高速かつ正常な128個の割り込みがあります。最近のcortex-mに基づく質問があります。おそらくthumb2のARMでlinuxを実行した場合のthumb2という質問があります。私は、cortex-mの実装はすべてマイクロコントローラクラスのチップで、数十キロバイトのチップメモリ​​しか持っていないと思いますが、基本的にはあなたが求めているカテゴリには該当しません。とにかく皮質-a9について尋ねています。

いくつかのコアまたはそれらのすべてに、起動アドレスが0x00000000または代替アドレスとして0xFFFF0000などのブートオプションを持つことがあります。これを使用するとARMユーザーにとっては非常に混乱しますが、ROMから電源を入れて起動し、実行時の操作のために例外テーブルをRAMに切り替えることができるように、あるアドレスにROMを、別のRAMにRAMを持つことができます。あなたはおそらくこれを行うことができるコアを持つチップを持っているかもしれませんが、コアフィーチャーのこれらのエッジを使用するかどうか、またはそれらをある設定に固定して柔軟性を提供するかどうかは、チップベンダーによって異なります。

問題のチップのデータシート/ドキュメントを確認する必要があります。 cortex-a9のように、ARMコアの名前を調べてください。理想的には、r0p0のようなものも知っていて、ARMのウェブサイトにアクセスして、そのコアのテクニカルリファレンスマニュアルであるTRMを見つけてください。また、ARM ARM、ARMアーキテクチャリファレンスマニュアルのコピーを入手することもできます。 (従来の)ARM例外ベクタは、ARM ARMには非常に多くの情報が記載されています。また、チップベンダのドキュメントも必要です。起動時にブートプロムにアドレス0を指定すると、ブートローダーは何かをしてレジスタに入れてビットを反転させ、メモリコントローラはアドレス0をRAMに切り替えます。いくつかは、RAMとして常に設定されているアドレス0と、ROMとして設定されている他のアドレスで、たとえば0x80000000と言うことができます。また、ブート前にromからramにいくつかの項目をコピーします。リセットベクトルがROMへの分岐になるように設定すると、ベクタテーブルにパッチを当てるのはブートローダの責任です。あなたが考えることができる多くの異なるスキームとして、それは誰かがそれを試している可能性がありますので、チップベンダーのドキュメントまたはサンプルコードを理解するために研究する必要があります基本的にROMの質問への答えは、それは依存しているチップベンダー。

コアのARM TRMには、コア上のストラップオプション(代替アドレスからブートできるようなもの)が記述されている場合は、ベンダーによって実装されているストラップオプション(存在する場合)を接続する必要があります。 ARM ARMは実際にTRMのようにそれに入るつもりはありません。しかし、購入する価値のあるベンダーは、ROMベースのブートストラテジが何であるかを示す独自のドキュメンテーションやコードを持つことになります。

Linuxシステムを対象とするシステムでは、ブートローダ、システムを起動して最終的にlinuxを起動する非Linuxコード(デスクトップ/ラップトップのBIOSに非常に似ています)があります。 Linuxは、(マイクロコントローラやその他のよく知られているARMの実装に比べて)かなりの量のメモリを必要とし、そのRAMはsramやdramになり、Linuxを起動する前にブートローダがメモリインタフェースを初期化しなければならないことがあります。 redbootやubootのようなポピュラーなブートローダがあります。どちらも重大な過大評価ですが、開発者やユーザーにLinuxなどの再フラッシュを可能にする機能を提供します。

ARM linuxにはATAG(ARM TAG)があります。伝統的なlinuxのコマンドラインと、ルートファイルシステムを見つけるためのアドレスやATAGsのようなlinuxのブート情報を伝えることができます。 Atagsはメモリ内の構造体で、r0などのものはブートローダからlinuxに分岐するときに設定されます。一般的なコンセプトはチップのパワーアップ、ROMやRAMからのブート、使用準備が整った場合のRAMの準備、ROMからROMへのコピーが必要な場合などです。ラムのどこかにコピーする。 ATAGは、必要に応じてLinuxを解凍する場所と、コマンドラインを見つける場所、ルートファイルシステムのようなものを見つけるために、Linuxに渡されたパラメータとしていくつかのレジスタが用意されています。 Linuxカーネルのエントリポイントを含むアドレス。

関連する問題