8

_属性_((section("name"))を使用するコードを実行し ました。gcc コンパイラの場合、これにより、リンカーに特定のセクション「name」で作成されたオブジェクトを配置するように指示できることを理解しています (「name」を使用)リンカー ファイルで宣言された絶対アドレス)。

.data セクションを使用する代わりに、これを行うポイントは何ですか?

4

3 に答える 3

8

多くの可能な用途があります。[注を追加するために編集: これは、私が見たり検討したりした用途の単なるサンプルであり、完全なリストではありません。]

たとえば、Linux カーネルは、一部のコードおよびデータ セクションを、カーネルのブートストラップ中にのみ使用されるものとしてマークします。これらは、カーネルの実行後に破棄して、他の用途のためにスペースを再利用できます。

これを使用して、特定のプロセッサ バリアント (コプロセッサの有無など) でパッチを適用する必要があるコードまたはデータ値をマークできます。

これを使用して、通常のメモリではなく、PROM に焼き付けたり、EEPROM に保存したりする「特別な」アドレス空間で物事を有効にすることができます。

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

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

于 2013-08-21T01:48:45.547 に答える
3

ユースケースの観点からは、次の.dataようにさまざまなタイプの があります。

  • 特定の CPU や NUMA ノードにローカルなデータ
  • .vdsoコンテキスト間で共有されるデータ (またはページと同様に、ユーザー/カーネル空間などvsyscall。または、別の例として、ブートローダーとカーネル)
  • 読み取り専用データまたは特定のアクセス モード/タイプの制限があるその他のデータ (たとえば、キャッシュ可能性またはキャッシュ常駐 - 後者は一部の ARM SoC で指定できます)
  • 「状態遷移」を保持するデータ (ハイバネーション イメージのロード、またはカーネルのクラッシュ/高速再起動の再初期化など)
  • 特定のライフタイム/ライフサイクルを持つデータ (起動中または操作中の特定の段階でのみ使用される、ライ​​トワンス データ)
  • 特定のカーネル サブシステムまたは特定のカーネル モジュールに固有のデータ
  • 「コード コロケーション」データ (x64 のアドレッシング オフセットはプラス/マイナス 2GB であるため、RIP相対アドレッシングが必要な場合、データは現在実行中のコードの範囲内にある必要があります)
  • 特定のハードウェア レジスタ空間 VA 範囲にマップされたデータ

したがって、最終的には属性__attribute__(...)に関することがよくあります (ここで使用されている言葉は、 gcc ソースコード内から述べることができるものよりも一般的な意味で使用されています。別のセクションが必要かどうか、および/または有用かどうかは、見る人の目に-システムデザイナー、つまり。

sectionしたがって、属性の可用性により柔軟性が得られます。つまり、私見では良いことです。

于 2013-08-22T12:36:09.237 に答える
0

数年後、書き留めておく価値があるので、特定の詳細を追加します。

独自のセクションを作成すると、自分で管理できます。特に、プリプロセッサ マクロを使用して、特定のデータ項目を特別なセクションに挿入できます。その特別なセクションを使用するのがプリプロセッサ マクロだけである場合、分散方式でデータ構造を作成することができます。

これは何を意味するのでしょうか?これは、次のようなプリプロセッサ マクロを記述し、ADD_VAR_TO_SPECIAL_SECTION(...)さまざまな値の束をランダムな順序で連結して、セクション内の配列 (または、すべてが同じ型でない場合は単に大きな古い山) になることを意味します。

これにより、コンパイル時に (ランダムに並べられた) データの配列を作成できます。初期化も登録もオーバーヘッドもありません。コードをコンパイルしてリンクするだけで、すべての異なるソース ファイルに含まれていたすべてのマクロが、すべての値を 1 つの大きな配列に追加します。

これをどのように使用できますか?たくさんの「モジュール」を作成します。init 関数と destroy 関数をアドホック配列に登録します。起動時に配列を処理します。(必要に応じて、ある種のトポロジー ソートを追加できます。) モジュールのマスター リストはどこにも必要なく、自動的に構築されます。または、単体テスト関数をテスト スイートに登録するマクロを作成します。ここでも、「登録」を必要としないアドホック リストが作成されます。

于 2021-12-19T05:50:24.793 に答える