logicalディレクティブ
構文
logicalrange-list= physicalrange-list
ここで、range-listは以下のいずれかです。
[region-expr,... ]region-expr
[region-expr,... ]fromaddress-expr
パラメータ
| Region式については、領域も参照してください。 |
| アドレス式 |
説明
logicalディレクティブは、論理アドレスを物理アドレスにマッピングします。ユーザアプリケーションから見えるのは論理アドレスですが、物理アドレスが通常コンテンツをメモリに読み込んだり、書き込んだりする際に使用されます。使用されているlogicalディレクティブがない場合や、アドレスがlogicalディレクティブの指定した範囲内にある場合は、物理アドレスは論理アドレスと同じです。
ELF出力を生成すると、マッピングはプログラム ヘッダーの物理アドレスに影響します。Intel HexまたはMotorola S-records フォーマットで出力を生成するときは、物理アドレスが使用されます。
指定された順序の論理範囲リストのそれぞれのアドレスは、指定された順序で物理範囲リストの関連するアドレスにマッピングされます。
1つまたは両方の範囲リストがfromフォームで終わらない限り、論理範囲と物理範囲の合計サイズが同じでなければなりません。片方だけがfrom フォームで終わる場合は、from フォームで終わる方には、サイズの最後の範囲が含まれ、可能なときは合計サイズを同一にします。両方がfromフォームで終わる場合は、範囲は合計サイズが一致するように一番高いアドレスに拡張します。
論理アドレスから物理アドレスにマッピングすることを設定すると、セクションやその他のコンテンツの配置の仕方に影響します。1つの独立した論理または物理範囲に、コンテンツが重複するように配置されることはありません。また、別の論理範囲から対応する物理範囲へのマッピングがある場合、物理範囲へのマッピングが指定されていない論理範囲(論理ディレクティブで言及されていない)は配置から除外されます。
すべてのlogicalディレクティブはともに適用されます。同じマッピングを指定するために1つまたは複数のディレクティブを使用しても結果は同じです。
例
// Logical range 0x8000-0x8FFF maps to physical 0x10000-0x10FFF. // No content can be placed in the logical range 0x10000-0x10FFF. logical [from 0x8000 size 4K] = physical [from 0x10000 size 4K];
// Another way to specify the same mapping logical [from 0x8000 size 4K] = physical from 0x10000;
// Logical range 0x8000-0x8FFF maps to physical 0x10000-0x10FFF. // Logical range 0x10000-0x10FFF maps to physical 0x8000-0x8FFF. // No logical range is excluded from placement because of // this mapping. logical [from 0x8000 size 4K] = physical [from 0x10000 size 4K]; logical [from 0x10000 size 4K] = physical [from 0x8000 size 4K];
// Logical range 0x1000-0x13FF maps to physical 0x8000-0x83FF. // Logical range 0x1400-0x17FF maps to physical 0x9000-0x93FF. // Logical range 0x1800-0x1BFF maps to physical 0xA000-0xA3FF. // Logical range 0x1C00-0x1FFF maps to physical 0xB000-0xB3FF. // No content can be placed in the logical ranges 0x8000-0x83FF, // 0x9000-0x9FFF, 0xA000-0xAFFF, or 0xB000-0xBFFF. logical [from 0x1000 size 4K] = physical [from 0x8000 size 1K repeat 4 displacement 4K];
// Another way to specify the same mapping. logical [from 0x1000 to 0x13FF] = physical [from 0x8000 to 0x83FF]; logical [from 0x1400 to 0x17FF] = physical [from 0x9000 to 0x93FF]; logical [from 0x1800 to 0x1BFF] = physical [from 0xA000 to 0xA3FF]; logical [from 0x1C00 to 0x1FFF] = physical [from 0xB000 to 0xB3FF];