のアドレスをコンパイルして実行するには、判別分析

Ubuntuはインターネットアーキテクチャとして16.04.2クロスコンパイラ環境アームlinux3.4.5アームS3C2440チップ

       32ビットプロセッサは、各命令の長さは、4バイトの順に、4バイトです。のみ実行順序を考慮すると、プロセッサは命令実行順序に従って順次読み出されますが、ジャンプを考慮して、この状態で格納された命令シーケンス、それを達成するための唯一の方法は、ジャンプのジャンプを実行した場合のみで、実施します「何バイトのバックまたはフォワード」の位置に、このような大会。ありません、これは非効率的で煩雑な計算である疑い

 

命令の必要性が対処するので、それは、各命令のアドレスを与えます。

これは、各バイトに与えられたアドレスの順序に従って、データを格納、コンパイル・プロセスのアドレスにおけるコンパイラ初期アドレスビットを行っています。

そして、これはアドレスコンパイラのアドレスです。

実際の実行アドレス操作の実行アドレスビットプログラム。


コンパイルアドレスが作家であるとみなすことができ、「期待する」実行時にアドレスし、実際にいくつかの違いをコンパイルして実行アドレス。


コンパイラに指定されたプログラムは、ソースファイルデータセグメントアドレスをコンパイルするときにアーム-Linuxの-LDを-Tパラメータを使用することができ、クロスコンパイラを知る最初の必要性
:など、
アームのLinux-LD -Ttext 0x30000000 start.O hello.o
すなわちコンパイルされたアドレス・テキスト(コード)セクションは、初期値として0x30000000に配置され、一般的にブロックされている順序:
の.text - >に.rodata - > .DATA - > .bssの

コードセグメント、.rodataの読み取り専用データ、データセグメント(記憶された初期化グローバル変数または静的変数)のため.DATA、。bssセグメント・ストアグローバル変数の初期化されていないの.text

-Tパラメータを指定しない場合、順次アドレッシング初期アドレス0であるアドレスに、デフォルトのルールに従ってコンパイラ

:コンパイル後に生成されたが、以下のステップを通過する必要は.elfファイル形式である
ARM-Linuxのobjcopyを-O-バイナリxxx.elf xxx.bin -S
ARM-Linuxの-objdumpは-D xxx.elf> xxx.dis
ファイル形式の.binデバイスにプログラムするために、第2のコマンドにより、逆アセンブルコードを生成するために使用され得ることができあなたが視覚的にコンパイラを見ることができます逆アセンブルコードは、プログラム、最適化、およびアドレッシング(コンパイラアドレス)を作るためにソースコードを変換します。


チップ内にプログラムを取得するプロセスを通過するためのプログラムをコンパイルした後、コンパイラが違いを生成し、アドレスに実行するためにどこにここにある
プログラムは、チップアドレスをアドレス指定する統一されたチップのフラッシュにプログラムしなければならないという仮定を0場所。その後:

1.アームのLinux-LD 0に初期アドレッシングのためにコンパイルされたプログラムのアドレスを指定された0または-Ttextパラメータである場合、プログラムは書込み動作にチップアドレス0をアドレス指定の動作の開始時に始まります(特に指定のない限り)0番地からスタートし、コンパイラアドレスは0からで、このような観点から、コンパイルおよびアドレスを実行する必要がありますしても、別のアドレスではありません

2. 0x30000000、0x30000000に与え-TtextパラメータのアームのLinux-LDの場合アドレッシング初期コンパイラに対処するために、1から見た、プログラムを実行する電動開始または0番地から始まる、アドレスが0の実行、ありますここでは、コンパイルと実行アドレスが異なるものになりますが、プログラムはまだ0から実行されますが、また、正常に実行することができます

 ここでは、名前は、位置コードのコードの実行に関連付けられているかどうかを位置独立コード及び位置関連コード、および2つの間の差から分かるの概念であることに言及すべきです。
位置独立コードは、一般相対行う他の位置に相対ジャンプ命令やジャンプを用いているので、ファイルの相対パスと同様の位置独立コードと呼ばれる実際のアドレスとは特に関係がありません。

位置関連の命令コードは、アドレスジャンプ、コンパイラによって指定されたアドレスへのジャンプ、及び命令はファイルに類似した絶対パスに関連する実際のアドレスをコンパイルされる絶対アドレスの使用を必要とします。

ARMアーキテクチャの命令によらず位置相対ジャンプ命令コードBの組、及び位置指令LDRに関連付けられたコード

ジャンプジャンプモードとしてBによってBは、メインPC +オフセット値(PC値が現在のアドレス+ 8に等しい)である
PC、ラボ(ここで参考としてLAB)によって実装され、ジャンプのLDR LDRラボを吸引しましたラベルのコンパイルが絶対アドレスにジャンプして、直接アドレス、PCに割り当てられた

0番地から統一されたチップをコンパイルを開始するようにプログラムされたプログラムが0番地から始まるメモリに保存されるように、ともあれば、0番地から実行し始めましたそれは命令とデータを取ることができるために必要な、プログラム格納される位置であるが、今のコンパイラを実行しているとアドレスが同じアドレスではありませんので、中間位置の相関コードをなし、アドレス0でのプログラムの実行中のプログラムは、実現可能です。
プログラム場合は、特定の初期化の対象には、使用説明書は、そのアドレスのコンパイラ、コンパイラと実行アドレスが同じ(PCランタイム)を達成することができ、「期待」のアドレスにPCのポインティングをLDR。

そして、ベアメタル・プログラムまたは例えば、多くの場合、他のプログラム矛盾のコンパイルおよびベアメタル・プログラムの実行アドレス、使用S3C2440チップ、収納ケース、先頭に0にnorflashアドレスとしてnorflashの使用が、私たちはnorflash同様のROMを知っているように、缶通常の読み出しデータが、いくつかのグローバル変数やグローバル変数がnorflash言葉に格納されている場合、スタック領域に格納されているが、必要なプログラムに従ってはならないだろう、プログラムに書き込むために私たちをリードされ、書き込みデータに特別な方法が必要ですコードニーズが生じた不整合がコンパイルので、そのような私のボードSDRAM上のように、別の記憶場所に移転のアドレスを実行するように、改変割り当てることができるよう。

コードがアドレスをコンパイルする前の領域に再配置されます、あなたがターゲット記憶領域を初期化する必要があり、例えば、私はSDRAMを使用し、その後、私はSDRAMの設定を初期化する必要があるだけでなく、ターゲット領域にコード、データ及びその他の情報をコピーする必要があることに注意し、私たちのために移転対象領域は、標的領域は、それが直接、絶対に予測できないことが起こるジャンプします、というよりも、アドレス0の記憶領域に格納されたコードのコードをコピーする前に空にされます?
 

他の異なるコンパイラと実行アドレスに関する理由からだけでなく、理由コードの移転の必要性は、ここでは、状況のいくつかの簡単な分析を行うために真実に似た他の例では、類推、類推によって学ぶことができる、があります。移転も差別的には、後で分析を避難します。


結論:
コンパイルアドレス:人工コード指定されたアドレスに対処する上でコンパイルプロセス、プログラマがされ、「期待」の位置が実行されています

 

オペレーティング・アドレス:プログラムポインタPCの値の実際の動作、および実際の操作と関連したコードベクトルメモリ位置。

 

為替へようこそ、議論したり私を修正!一般的な進歩!

-------------------------------------------------- -------

2020いくつかの新しいアイデアを再訪、と会場できhttps://blog.csdn.net/G_METHOD/article/details/104508545

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

おすすめ

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