2013-08-21 12 views
5

私はコードを実行しました_ 属性 _((セクション( "name"))。これはgccコンパイラでは、特定のセクション "name"で作成されたオブジェクトを配置するように指示することができます。?「名前」リンカファイルで宣言された絶対アドレス)で__attribute __((section( "name")))usage?

これを行うためのポイントだけではなく.dataセクションを使用するのは何である

+0

これは、それが私が取り組んでいるコードのプラットフォームだからです。私はこの____attribute____が特定のプラットフォームでのみ利用可能であるという事実を認識しているので、明確にするためにそれを含めることにしました。私は、特定のオブジェクトをテストオブジェクト、トレーシングオブジェクトなどに分割するときに、コーダの意図が何であるかを理解しようとしています。 – tll

+0

ARMセクションを削除したので、特にARMについては心配していません。 – tll

答えて

5

多くの可能な用途がある[メモを追加するには、編集:これは、私が見ただけの使用例であり、完全なリストではありません。]

Linuxカーネルは、たとえば、いくつかのコードとデータセクションをマークしていますnsはカーネルのブートストラップ中にのみ使用されます。これらは、カーネルが実行された後に投げ捨てられ、他の用途のためにスペースを再利用することができます。

これを使用して、特定のプロセッサーの変形(たとえば、コプロセッサーの有無にかかわらず)を必要とするコードまたはデータ値をマークすることができます。

通常のメモリではなく、PROMに書き込むかEEPROMに保存する "特別な"アドレス空間に物を生かすことができます。

これは、初期化やクリーンアップ、プログラムの開始前と終了時に実行されるC++コンストラクタやデストラクタのように、コード領域やデータ領域をまとめて収集するために使用できます。私は自分自身でARMコードを書いていないので、ARMにどれだけ適用されるかを知っている)。

実際の使用はリンカースクリプトによって異なります。

+0

その他の用途は、** hot * **と* cold * ** * cache locality *です。また、割り込み処理、スケジューリングなどの機能をパーティション化することもできます。ルーチン/機能が1つの 'C'ファイルに含まれていても、典型的な実行パスは*コールスタック*をグループ化することによって利益を得ることができます。いくつかのコードは、* flash *または* internal ram *から実行できます。これらのリソースは制限されている可能性があります。 –

+0

@torek初期化/クリーンアップのためのコード/データ領域の収集に関する最後のポイントは、プログラムの開始前にコンパイル時ではなく実行時にコードを含めることができるということです。 #ifdefのより良いバージョンのようなもの? – tll

+0

私はあなたがここで何を求めているか正確にはわかりません。いくつかのセクションを含むリンカースクリプトを書いて他のセクションを破棄した場合、* link *時には断片を含めるか除外することができます。 *実行時には、リンカースクリプトと実行時コードの調整が必要です。これははるかに困難です。 – torek

2

ビューのユースケースの点から、等.dataの異なる種類の多くがある:特定のCPUおよび/またはNUMAノード(/ユーザなどのコンテキスト間で共有

  • データへのローカル

    • データが例えば、.vdsoまたはvsyscallページ、あるいは別の例では、ブートローダとカーネル)
    • 特定のアクセスモード/タイプの制限を持つ読み取り専用データまたは他のデータ(キャッシュ可能性またはキャッシュ常駐性 - 後者は一部のARM SoC)
    • 特定のライフタイム/ライフサイクル(起動中または動作中の特定のステージでのみ使用される、追記型データのみ)のデータ、「状態遷移」(ハイバネーションイメージのロード、クラッシュカーネル/高速リブートの再初期化など)を持続するデータ
    • 特定のカーネル・サブシステムまたは特定のカーネルモジュール
    • に固有のデータのx64でのオフセットに取り組む(データを「コード共存は」プラス/マイナス2ギガバイトあるあなたが取り組むRIP -relativeをしたい場合は、データはあなたのその範囲内でなければならないので、現在実行中のコード)
    • 特定のハードウェアレジスタスペースにマップされたデータVA範囲

    だから最後にそれは多くの場合、約属性(ここ__attribute__(...)あなたはGCCのソースコード内からの状態を可能にするものよりも、より一般的な意味で使われる単語です。他のセクションが必要であるか、有用であるかどうかは、見る者の目に - システムデザイナー - です。

    section属性の利用可能性は、したがって、は、柔軟性のためにを使用することができます。つまり、IMHOは良いことです。