7.2.3 ルート実行領域と FIXED 属性

スキャッタファイルで実行領域の FIXED 属性を使用して、ロードアドレスと実行アドレスを固定したルート領域を作成できます。

FIXED 実行領域属性を使用して、特定の領域のロードアドレスと実行アドレスに同じアドレスを指定します。
FIXED 属性を使用して、ROM 内の特定のアドレスに任意の実行領域を配置できます。
例えば、以下のメモリマップは固定実行領域を示しています。
図 7-3 固定実行領域のメモリマップ
この図を表示するには、ご使用のブラウザが SVG 形式をサポートしている必要があります。ネイティブでサポートしているブラウザをインストールするか、次のような適切なプラグインをインストールします。Adobe SVG Viewer。.

以下の例では、対応するスキャッタロード記述を示しています。
LR_1 0x040000              ; ロード領域を 0x40000 から開始する
{                          ; 実行領域の開始位置の記述
    ER_RO 0x040000         ; load address = execution address
    {
        * (+RO)            ; init.o 以外の RO セクション
    }
    ER_INIT 0x080000 FIXED ; この実行領域のロードアドレスと
                           ; 実行アドレスが 0x80000 に固定される
    {
        init.o(+RO)        ; init.o のすべての RO セクション
    }
    …                    ; 残りのスキャッタロード記述
}
この属性を使用して、関数または定数テーブルやチェックサムなどのデータブロックを ROM 内の固定アドレスに配置することで、ポインタを使用して容易にアクセスできます。
初期化コードを ROM の最初に配置し、チェックサムを ROM の最後に配置するような場合には、メモリの一部が使用されない可能性があります。 * または .ANY モジュールセレクタを使用することで、初期化ブロックの最後とデータブロックの最初の間にある領域を充填できます。
コードの保守とデバッグを容易にするには、スキャッタファイル内での配置に関する指定を最小限に抑え、関数とデータの詳細な配置はリンカに委ねることを推奨します。

FIXED 属性と 1 つのロード領域を使用することが適切ではない場合があります。固定位置の指定に関しては以下のような方法もあります。
  • ローダで複数のロード領域を処理できる場合には、RO コードまたはデータを専用のロード領域内に配置します。
  • 関数またはデータを ROM 内の固定位置に配置する必要がない場合には、FIXED 属性の代わりに ABSOLUTE 属性を使用します。この属性を使用すると、ローダはロード領域から RAM 内の指定されたアドレスにデータをコピーします。ABSOLUTE がデフォルトの属性です。
  • メモリマップされた I/O の位置にデータ構造を配置するには、2 つのロード領域を使用して UNINIT 属性を指定します。UNINIT を指定すると、そのメモリ位置はゼロで初期化されません。

FIXED 属性の誤った使用を示す例

以下の例では、FIXED 実行領域属性の誤った使用の一般的な事例を示しています。
LR1 0x8000
{
    ER_LOW +0 0x1000
    {
        *(+RO)
    }
; この時点で、次の使用可能なロードアドレスと実行アドレスが 0x8000 +
; ER_LOW の内容のサイズになります。最大サイズは 0x1000 に制限されているため、次の使用可能なロードアドレスと
; 実行アドレスは最大で 0x9000 になります。
    ER_HIGH 0xF0000000 FIXED
    {
        *(+RW+ZI)
    }
; 必要な実行アドレスとロードアドレスは 0xF0000000 です。ロードアドレスと
; 実行アドレスが一致するように、リンカによって 0xF0000000 - (0x8000 + (ER_LOW) のサイズ) バイトの
; パディングが挿入されます。
}
; その他の FIXED の誤った使用の一般的な事例として、次の使用可能なロードアドレスよりも
; 下位の実行アドレスを指定することがあります。
LR_HIGH 0x100000000
{
    ER_LOW 0x1000 FIXED
    {
        *(+RO)
    }
; LR_HIGH の次の使用可能なロードアドレスは 0x10000000 です。必要な実行
; アドレスは 0x1000 です。LR_HIGH の次の使用可能なロードアドレスは単調に
; 増加させる必要があるため、リンカは ER_LOW に 0x10000000 よりも下位のロードアドレスを指定できません。
}
関連する概念
8.4 実行領域の記述
8.3.4 ロード領域のアドレス属性の継承規則
8.3.5 RELOC アドレス属性の継承規則
8.4.4 実行領域のアドレス属性の継承規則
関連する参考文書
8.3.3 ロード領域の属性
8.4.3 実行領域の属性
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.