7.4.5 .ANY セクションの配置アルゴリズムの使用例

ここでは、 sections.oRO-CODE セクションを例に、配置アルゴリズムの動作を説明します。

入力セクションのプロパティと順序を以下の表に示します。

表 7-1 入力セクションのプロパティ(.ANY セクションの配置)

Name サイズ
sec1 0x4
sec2 0x4
sec3 0x4
sec4 0x4
sec5 0x4
sec6 0x4
この例で使用するスキャッタファイルは次のとおりです。
LR 0x100
{
  ER_1 0x100 0x10
  {
     .ANY
  }
  ER_2 0x200 0x10
  {
     .ANY
  }
}

例では、--any_contingency を無効にしています。

first_fit、next_fit、best_fit の例

この例では、同じサイズの複数のセクションを、同じセレクタで 2 つの領域に割り当てる状況を考えます。セレクタは等しく限定的で、 .ANY(+R0) に相当します。優先順位は設定されていません。
    Execution Region ER_1 (Base: 0x00000100, Size: 0x00000010, Max: 0x00000010, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x00000100   0x00000004   Code   RO            1    sec1                sections.o
    0x00000104   0x00000004   Code   RO            2    sec2                sections.o
    0x00000108   0x00000004   Code   RO            3    sec3                sections.o
    0x0000010c   0x00000004   Code   RO            4    sec4                sections.o


    Execution Region ER_2 (Base: 0x00000200, Size: 0x00000008, Max: 0x00000010, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x00000200   0x00000004   Code   RO            5    sec5                sections.o
    0x00000204   0x00000004   Code   RO            6    sec6                sections.o
この例では、以下のようになります。
  • first_fit の場合、リンカはまず、すべてのセクションを ER_1 に割り当ててから、次に利用可能な領域である ER_2 に移ります。
  • next_fit の場合も、リンカの動作は基本的には first_fit と同じです。ただし、ER_1 が一杯になると、この実行領域は FULL としてマークされ、それ以降、考慮されることはありません。この例では、ER_1 は一杯です。そのため、ER_2 が考慮されます。
  • best_fit の場合、リンカは、sec1ER_1 に割り当てます。この時点で優先順位も限定性も等しい 2 つの領域が存在しますが、残っているスペースは ER_1 の方が少なくなりました。このとき、リンカは、sec2ER_1 に割り当て、ER_1 が一杯になるまでセクションを割り当て続けます。

worst_fit の例

この例は、worst_fit アルゴリズムを使用した場合のイメージのメモリマップを示しています。
    Execution Region ER_1 (Base: 0x00000100, Size: 0x0000000c, Max: 0x00000010, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x00000100   0x00000004   Code   RO            1    sec1                sections.o
    0x00000104   0x00000004   Code   RO            3    sec3                sections.o
    0x00000108   0x00000004   Code   RO            5    sec5                sections.o


    Execution Region ER_2 (Base: 0x00000200, Size: 0x0000000c, Max: 0x00000010, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x00000200   0x00000004   Code   RO            2    sec2                sections.o
    0x00000204   0x00000004   Code   RO            4    sec4                sections.o
    0x00000208   0x00000004   Code   RO            6    sec6                sections.o
リンカはまず、sec1ER_1 に割り当てます。この時点で、優先順位も限定性も等しい 2 つの領域が存在します。リンカは、空きスペースに最も余裕のある領域(この例では ER_2)に sec2 を割り当てます。今度は、2 つの領域の空きスペースが等しくなりました。このとき、リンカは、スキャッタファイル内で先に出現する領域(ER_1)に sec3 を割り当てます。

worst_fit の動作は、現バージョンのリンカのデフォルトの動作であり、以前のバージョンのリンカで唯一利用できるアルゴリズムです。
関連する概念
7.4.3 .ANY セクションの優先順位
7.4.2 複数の .ANY セレクタの入力セクションの配置を制御するためのコマンドラインオプション
7.4.4 未割り当てセクションの配置に使用できる最大領域サイズの指定
7.4.6 領域の割り当て、セレクタ、および優先度の動作を示す next_fit アルゴリズムの例
関連する参考文書
12.125 --scatter=filename
12.4 --any_placement=algorithm
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.