7.6 オーバーレイを使用したセクションの配置

オーバーレイを使用して、同じアドレスに複数の実行領域を配置できます。

OVERLAY 属性を使用すると、複数の実行領域を同じアドレスに配置できます。実行領域を一度に 1 つだけインスタンス化するには、オーバーレイマネージャが必要です。 ARM® コンパイラ にはオーバーレイマネージャは付属していません。
以下の例では、RAM 内のスタティックセクションと、その後に続く一連のオーバーレイの定義を示しています。この例では、一度にこれらのセクションの 1 つのみをインスタンス化しています。
EMB_APP 0x8000
{
    …
    STATIC_RAM 0x0                  ; RW と ZI のコード/データのほとんどを含む
    {
            * (+RW,+ZI)
    }
    OVERLAY_A_RAM 0x1000 OVERLAY    ; オーバーレイの開始アドレス…
    {
            module1.o (+RW,+ZI)
    }
    OVERLAY_B_RAM 0x1000 OVERLAY
    {
            module2.o (+RW,+ZI)
    }
    …                        ; 残りのスキャッタロード記述
}
OVERLAY としてマークされている領域は、起動時に C ライブラリによって初期化されません。オーバーレイ領域が使用するメモリの内容は、オーバーレイマネージャが管理します。また、領域に初期化されたデータが含まれている場合は、NOCOMPRESS 属性を使用して RW データが圧縮されないようにします。
リンカ定義シンボルを使用して、コードとデータのコピーに必要なアドレスを取得できます。
OVERLAY 属性は、別の領域とは異なるアドレスを持つ単一の領域で使用できます。したがって、C ライブラリスタートアップコードによる特定の領域の初期化を避ける方法として、オーバーレイ領域を使用できます。他のオーバーレイ領域と同様に、これらの領域はコード内で手動で初期化する必要があります。
オーバーレイ領域は相対ベースを持つことができます。 +offset ベースアドレスを持つオーバーレイ領域の動作は、その前の領域と +offset の値に依存します。連続する +offset 領域の +offset の値が同じ場合、それらの領域はリンカによって同じベースアドレスに配置されます。
+offset の実行領域 ER が、オーバーレイ実行領域の連続する重複ブロックに続けて存在する場合、ER のベースアドレスは次のようになります。
オーバーレイ実行領域の重複ブロックのリミットアドレス + offset
以下の表には、+offset OVERLAY 属性と共に使用した場合の影響を示しています。REGION1 は、スキャッタファイル内の REGION2 の直前に配置されます。

表 7-7 オーバーレイでの相対オフセットの使用

REGION1 を OVERLAY と共に設定する +offset REGION2 ベースアドレス
いいえ <offset> REGION1 のリミット + <offset>
はい +0 REGION1 ベースアドレス
はい <non-zero offset> REGION1 のリミット + <non-zero offset>
以下の例では、相対オフセットをオーバーレイと共に使用した場合の実行領域のアドレスに対する影響を示しています。
EMB_APP 0x8000
{
    CODE 0x8000
    {
        *(+RO)
    }
    # REGION1 Base = CODE limit
    REGION1 +0 OVERLAY
    {
        module1.o(*)
    }
    # REGION2 Base = REGION1 Base
    REGION2 +0 OVERLAY
    {
        module2.o(*)
    }
    # REGION3 Base = REGION2 Base = REGION1 Base
    REGION3 +0 OVERLAY
    {
        module3.o(*)
    }
    # REGION4 Base = REGION3 Limit + 4
    Region4 +4 OVERLAY
    {
        module4.o(*)
    }
}
オーバーレイでない領域の長さが不明な場合は、ゼロ相対オフセットを使用してオーバーレイの開始アドレスを指定することで、オーバーレイをスタティックセクションの直後に配置できます。
以下のコマンドラインオプションを使用すると、イメージにさらにデバッグ情報を追加できます。
  • --emit_debug_overlay_relocs
  • --emit_debug_overlay_section
これらを使用することで、現在有効なオーバーレイをオーバーレイに対応したデバッガで追跡できるようになります。
関連する概念
7.2.6 特定のアドレスに __at セクションの配置
8.3 ロード領域の記述
8.3.6 ロード領域に相対アドレス +offset を使用する際の注意事項
8.4.5 実行領域に相対アドレス +offset を使用する際の注意事項
6.2 リンカ定義のシンボル
8.3.4 ロード領域のアドレス属性の継承規則
8.3.5 RELOC アドレス属性の継承規則
8.4.4 実行領域のアドレス属性の継承規則
関連する参考文書
12.46 --emit_debug_overlay_relocs
12.47 --emit_debug_overlay_section
8.3.3 ロード領域の属性
8.4.1 実行領域の記述に含まれているコンポーネント
8.4.3 実行領域の属性
関連情報
__attribute__((section("name"))) 変数属性
『ABI for the ARM Architecture: Support for Debugging Overlaid Programs』
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.