ポインターのスウィズリング

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

コンピューター サイエンスで はポインター スウィズリングとは、名前または位置に基づく参照を直接ポインター参照 (メモリ アドレス) に変換することです。これは通常、実行可能ファイルやポインターベースのデータ構造など、ディスク ファイルからの再配置可能なオブジェクトの逆シリアル化または読み込み中に実行されます。

メモリ ポインターを位置に依存しないシンボルまたは位置に置き換える逆の操作は、unswizzlingと呼ばれることがあり、シリアル化(保存) 中に実行されます。

次のような要素を使用して、リンクされたリストのデータ構造を 簡単に作成できます。

構造体 ノード{ 
        整数データ; 
        構造体 ノード*; 
};

ただし、リストをファイルに保存してから再ロードすると (ほとんどのオペレーティング システムで) すべてのリンクが壊れ、リストが役に立たなくなります。これは、ノードが同じメモリ位置にロードされることはほとんどないためです。リストを便利に保存および取得する 1 つの方法は、各ノードに一意の ID 番号を割り当て、次のノードの ID 番号を示すフィールドにポインターを変換してポインターを アンスウィズルすることです。

struct  node_saved { 
        整数データ; 
        int id_number ; 
        int id_number_of_next_node ; 
};

このようなレコードは、任意の順序でファイルに保存でき、リストを壊さずに再読み込みできます。他のオプションには、次のノードのファイル オフセットまたは保存されたレコードのシーケンス内の位置を示す番号を保存すること、または単純にノードを順番どおりにファイルに保存することが含まれます。

このようなリストをロードした後、その番号に基づいてノードを見つけるのは面倒で非効率的です (シリアル検索)。リストのトラバースは、元の「次の」ポインターを使用すると非常に高速でした。リストを元の形式に戻す、またはポインターを入れ替えるには、各ノードのアドレスを見つけて、id_number_of_next_node フィールドを正しいノードへの直接ポインターに戻す必要があります

アンスウィズルの方法

ポインターをアンスウィズルできる形式は無数にある可能性がありますが、最も一般的なものには次のものがあります。

  • ファイル内のポイントされたオブジェクトのオフセット
  • 一連のレコード内のポイントされたオブジェクトのインデックス
  • 個人の社会保障番号など、ポイント先のオブジェクトが持つ一意の識別子データベースでは、すべてのポインターがこの方法でアンスウィズルされます (外部キーを参照)。

スウィズリングの方法

一般的なケースでのスウィズリングは複雑になる可能性があります。ポインターの参照グラフには、任意の数のサイクルが含まれる場合があります。これにより、元のスウィズルされていない値から新しいアドレスへのマッピングを維持することが複雑になります。連想配列はマッピングを維持するのに役立ちますが、幅優先検索などのアルゴリズムはグラフをトラバースするのに役立ちますが、どちらも追加のストレージを必要とします。さまざまなシリアライゼーション ライブラリが、一般的なスウィズル システムを提供します。ただし、多くの場合、スウィズリングは、参照のツリー構造やリスト構造などの単純化された仮定で実行できます。

さまざまなタイプのスウィズリングは次のとおりです。

  • 自動スウィズル
  • オンデマンドのスウィズリング

潜在的なセキュリティの弱点

セキュリティのために、アンスウィズリングとスウィズリングは細心の注意を払って実装する必要があります。特に、特別に細工されたファイルを攻撃者が提示すると、想定された適切な範囲外のアドレスへのアクセスが許可される可能性があります。メモリ保護が弱いシステムでは、これにより機密データが公開されたり、実行される可能性のあるコードが変更される可能性があります。システムがデータの実行に対するガードを実装していない場合、システムはさまざまな種類のマルウェアのインストールによって深刻な危険にさらされる可能性があります。

保護方法には、データをアプリケーションにリリースする前の検証が含まれます。

  • すべてのオフセットが読み取られたデータの範囲内にあること。
  • インデックスのテーブルと指しているレコードも同様に制約されます。
  • その識別子は一意であり、機密性の高い場合は暗号化されています。
  • すべての可変長データが、実際の割り当てを超えない長さに制限されていること。
  • その割り当ては妥当なサイズです。
  • データ読み取りでロードされていない割り当てがクリアされるか、特定のパターンでロードされます。

も参照

  • Relocation、積極的なポインター変更の形式

参考文献

さらに読む

  • ウィルソン、ポール R. (1991-07-01) [1991 年 6 月]。「ページ フォールト時のポインターのスウィズリング: 標準ハードウェアで巨大なアドレス空間を効率的にサポートする」. ACM SIGARCH コンピュータ アーキテクチャ ニュース巻。19、いいえ。4. 6 ~ 13 ページ。ドイ: 10.1145/122576.122577 .
  • ケンパー、アルフォンス。コスマン、ドナルド (1995 年 7 月)。「オブジェクト ベースにおける適応可能なポインタ スウィズリング戦略: 設計、実現、および定量分析」 (PDF) . 超大規模データベースに関する国際ジャーナル (VLDB)4 (3): 519–567. ドイ: 10.1007/BF01231646 . S2CID  4556203 . 2008-07-25 のオリジナルからアーカイブ (PDF) 2021 年12 月 8 日閲覧(49ページ)
  • クロフォード、デレク (1992 年 6 月)。Derek の C の ABC です巻。2. pp. 340–343。