ベアメタル ARM アプリケーション用にカスタマイズされたリンカー スクリプトを作成しています。アプリケーションはフラッシュ メモリに保存されます。現時点では、アプリケーション全体を SDRAM にコピーする起動コードがあり、高速化のために SDRAM で実行を続けています。このスクリプトを変更して、コード全体をフラッシュから直接実行したいのですが、特定の要素を理解するのに問題があります。
以下のリンカ スクリプトでは、.ram_data
セクションに実行アドレスRAM
とロード アドレスがありますROM
(どちらのセクションも SDRAM にあります)。私が理解していることから、リンカーは実行アドレスを使用して、PC 相対ではないすべての要素のシンボル解決を行いますが、ロードアドレスはどうですか? ベアメタル ARM のコンテキストでは、プログラム ローダーのようなものは存在せず、リンカがフラッシュ内のプログラムを書き込む場所に影響を与えることはできません。では、リンカは実際には何に使用されるのでしょうか?
同様に、リンカは実行時に SDRAM が (rx) または (rw) であることにどのように影響を与えることができますか? メモリ領域でこれらのオプションを変更すると、実際に何かが変更されますか?
MEMORY
{
RAM(rw) : ORIGIN = 0x00001000, LENGTH = 12M-4K
ROM(rx) : ORIGIN = 0x007f1000, LENGTH = 60K
}
SECTIONS
{
.startup :
{ ... } > VECTOR
.rom_text :
{ ... } > ROM
.ram_data :
{
_data_start = .;
*(.data*)
_data_end = .;
} > RAM AT>ROM
.ram_bss :
{ ... } > RAM
}