読み込みと実行アドレス&再配置(2020)

2018年には、それは比較の成長の独自のこれらの年だったかのように、再びそれを行うには、レコードを開くにはので、ここで、誤謬のいくつかの発見に加え、いくつかのレイアウト上の問題の前に、2020年にビットを振り返って、コンテンツを書きました。(テーマは、実際の使用に由来する概念のいくつかと一緒に使用するスクリプトのアドレスにリンクされ、リンカスクリプトの内容は、参照することができる  http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_monoを/ld.html#IDX237  )

2018年のコンパイルと実行アドレスと題し、より正確があるはずロードアドレスあなたが実行したときのアドレス(または再配置アドレス)を、あなたにも導入する必要があるメモリアドレスを

知っておく必要がありますが、ベアメタル必要性を実行するための選択のプログラムがメモリに格納されるとNorFlashまたはNandFlashすることができ、プログラムは復号プログラムの実行を読み込む際にメモリに保存されたスタティックメモリ、すべての種類を節約するためにパワーダウンすることができ、一般的な起動したプログラムです裸ボードプログラムは0番地コードから取るし始めている、私たちのプログラムはまた、自然に0がプログラムで保存されたメモリアドレス0から開始する必要があり、メモリアドレス、それは任意に決定することができ、およそメモリ書き込みの専用メモリアドレスと、あなたも、もちろん、これは非常に適切に機能するために裸のボードをプログラムするために、我々はアドレス0にプログラムを保存し、必要がブートプログラムアドレス0が存在するまま、プログラム格納中間の位置を書き込むことができます。

しかし、プログラム起動して実行した後、様々な理由のために、元のメモリアドレスで実行することはできません、ここに理由があるかもしれません。

1.我々が使用NorFlashメモリは読み出し専用メモリをプログラムまたはローカル変数や他のデータ及びBSSセグメントデータ静的で使用されるグローバル変数を引き起こす、(実行中の目的のために、チップNorFlashマニュアルの使用は、コマンドはまただけ書き込むことができ提供します)そのプログラムのロジックに影響を与える、変更することはできません。

2. 0として使用NandFlash、S3C2440チップに、例えば、NandFlashの使用はブートフラッシュとして、2440のNandFlashメカニズムは最初の4KチップSRAMに内容をコピーするために存在し、SRAMアドレスは、私たちのプログラムであれば、この時点でプログラムを実行しますより4Kのサイズよりも、それは実行しないプログラムが発生します。

これは、上記の理由が存在する、我々は利用可能なメモリ、一般的にSDRAMに移転プログラムを必要とするのである、SDRAMは、ベースアドレスが0x3000のあるものとする、そして、私たちはプログラムのためのメカニズムを必要とするので、そのプログラムを実行した後0x3000のアドレス動作は、このメカニズムが呼び出される再配置、プログラムのための0x3000のアドレスを実行しています

ランタイムアドレスがプログラムのアドレスが実行されているにかかわらず、プログラムが実行されているものをアドレスに順に格納されている場所の、プログラム自体が検討するランタイム対処実行することで実行するために、すべてのグローバル変数と静的ローカル変数やその他のデータセクションやBSSセグメントデータをこうしたグローバル変数aとして、アクセスするアドレスをアドレス指定する際に、実行時のアドレスが0x301Fで、コードがアクセスまたは割り当てに値0x301Fにこのアドレスを変数のすべてを使用する必要があります、この時間は問題は、私たちのプログラム記憶を生じ0のアドレスではなく、移転前に、0x3000の、その後のアドレスデータが0x301Fに、この時間は値が未定義の動作で、不明です。同様に、機能関数Aがある場合は、彼のランタイムアドレスは0x321Fで、0x11FFの彼のメモリアドレスがかもしれないが、ないアドレスにジャンプするために、絶対ジャンプ命令を使用して配置する前に、未定義の実行時の動作です。

アドレス0に格納されたプログラムは、単に出発場所ですしているプログラムを実行すると、アドレス0で実行を開始することですが、プログラムの感触(各命令のアドレスを決定するために、実際にコンパイル時には、あなたが解体見ることができます)直接使用の問題ならば、実行時のアドレス0x3000の実行は、グローバル変数へのアクセスは、実行時のアドレスを介してアクセスされます。このプログラムは、理由は使用位置に依存しないコードを、適切に機能することができたあなたはジャンプが直接にも問題があり、ジャンプ、絶対に使用している場合は、ジャンプは比較的されています。

エリア対応再配置はよくコンパイル時に決定され、実行時にデータとアドレスコードが充填されて、メモリアドレスは、すべての必要な「材料」を有しています Iからのプログラム・メモリ・アドレスを含ん1.一般的な再配置は、実行時に自分のアドレスをコピーし、2。のようなbssセクションをクリアします。

最後に、ロードアドレスもbinファイルのサイズに影響を与えるロードアドレスとアドレス構造体に格納されたアドレスと同じアドレス、すなわち、相対的な位置に保存されたベアボードプログラム、ファイル構造コンパイル出力ビン構造NorFlash 0、通常放電をコンパクトにすることができ、その後、ランタイムのアドレスに対応するアドレスから実行時のロードアドレスにデータをコピーするために移転しました。

過去2年間の能力は以下のように変更されたすべての文字を実装するために、まだ思考の無数の進行状況を記載していないことが判明し、またはいくつかの助けを必要にグラフを添付します。

次の図は、メモリのリンカスクリプトファイル、最終的な分布の使用を記載しています。

我々は、に示すように、コードセグメントのロードアドレスは、ランタイムアドレスが0x3000のと0x31FFている間、データ・セグメントのロードアドレス0x80の0で、その後直ちに、コードとデータセグメントをロードした後、符号長が0x80であると仮定すると仮定するセグメントの合計がここにアドレス0、0にメモリアドレス、メモリアドレス、我々は自分自身を設定している時にロードされていないゼロアドレスNorFlash(に保存されているサイズなどのビンのサイズは、Shucks保存堆積したい、ロードアドレスだけで空にしません次のように)配置を対向するが、動作要件チップにコード均一な負荷が0である簡素化されます。

 あなたは明らかに状況が数字でロードアドレスと実行時のアドレスものの多くを移転見ることができます。

疑いの歓迎に、また議論が交換が正しく記載されていないことを指摘歓迎した場合、容量の制約によって発現は、いくつかはよく、明確に説明されていません。早期の心を忘れませんでした。

公開された19元の記事 ウォン称賛7 ビュー6923

おすすめ

転載: blog.csdn.net/G_METHOD/article/details/104508545