2.4.5. ルート領域

ルート領域とは、ロードアドレスが実行アドレスと同じ実行領域のことです。各スキャッタローディング記述ファイルには、少なくとも 1 つのルート領域が必要です。

スキャッタローディングでは、実行領域の作成(例えば、コードとデータのコピーやゼロ初期化)に関与するコードとデータは別の場所にコピーできないという制約があります。そのため、ルート領域には以下のセクションが含まれている必要があります。

上記のセクションは InRoot$$Sections を使用して記述できます。

上記のセクションは読み出し専用として定義されるため、* (+RO) ワイルドカード構文でグループ化されます。そのため、* (+RO) が非ルート領域で指定されている場合は、上記のセクションをルート領域で明示的に宣言する必要があります。これはExample 2.4 に示しています。

Example 2.4. ルート領域の指定

ROM_LOAD 0x0000 0x4000
{
  ROM_EXEC 0x0000 0x4000      ; root region
  {
    vectors.o (Vect, +FIRST)  ; Vector table
    * (InRoot$$Sections)      ; All library sections that must be in a
                              ; root region, for example, __main.o,
                              ; __scatter*.o, __dc*.o, and * Region$$Table
  }
  RAM 0x10000 0x8000
  {
    * (+RO, +RW, +ZI)         ; all other sections
  }
}

__main.o__scatter.o__dc*.o、および Region$$Table がルート領域に含まれていない場合は、リンカによって以下のようなエラーメッセージが生成されます。

Error: L6202E: Section Region$$Table cannot be assigned to a non-root region.
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0203GJ
Non-Confidential