コンピュータ サイエンス において、ポインタ スウィズリングとは、名前または位置に基づく参照を直接のポインタ参照 (メモリ アドレス)に変換することです。通常、実行可能ファイルやポインタ ベースのデータ構造などのディスク ファイルからの再配置可能オブジェクトの逆シリアル化または読み込み中に実行されます。
メモリ ポインタを位置に依存しないシンボルまたは位置に置き換える逆の操作は、アンスウィズリングと呼ばれることもあり、シリアル化(保存) 中に実行されます。また、両方の操作をスウィズリングと呼ぶこともできます。
例
次のような要素を使用して、リンク リストデータ構造を簡単に作成できます。
構造体ノード{ intデータ;構造体ノード* next ; };
しかし、リストをファイルに保存して再ロードすると、(ほとんどのオペレーティング システムでは) すべてのリンクが壊れ、リストが役に立たなくなります。これは、ノードが同じメモリ位置にロードされることがほとんどないためです。リストを有効に保存して取得する 1 つの方法は、各ノードに一意の ID 番号を割り当て、ポインターを次のノードの ID 番号を示すフィールドに変換して、ポインターをアンスウィズルすることです。
構造体node_saved { intデータ; int id_number ; int次のノードの id_number ; };
このようなレコードは、任意の順序でファイルに保存し、リストを壊すことなく再ロードできます。その他のオプションには、次のノードのファイル オフセット、または保存されたレコードのシーケンス内の位置を示す番号を保存することや、単にノードをファイルに順番に保存することなどがあります。
このようなリストをロードした後、番号に基づいてノードを検索するのは面倒で非効率的です (シリアル検索)。リストのトラバースは、元の「次の」ポインターでは非常に高速でした。リストを元の形式に戻す、つまりポインターをスウィズルするには、各ノードのアドレスを見つけて、id_number_of_next_nodeフィールドを正しいノードへの直接ポインターに戻す必要があります。
スウィズリング解除の方法
ポインターをアンスウィズルできる形式は潜在的に無限にありますが、最も人気のある形式は次のとおりです。
- ファイル内の指し示されたオブジェクトのオフセット
- レコードのシーケンス内の指し示すオブジェクトのインデックス
- 指し示されたオブジェクトが持つ一意の識別子(個人の社会保障番号など)。データベースでは、すべてのポインターはこのようにアンスウィズルされます(外部キーを参照)。
スウィズリングの方法
一般的なケースでのスウィズリングは複雑になることがあります。ポインタの参照グラフには任意の数のサイクルが含まれる可能性があり、これにより、古いスウィズリングされていない値から新しいアドレスへのマッピングの維持が複雑になります。連想配列はマッピングの維持に役立ち、幅優先探索などのアルゴリズムはグラフのトラバースに役立ちますが、どちらも追加のストレージが必要です。さまざまなシリアル化 ライブラリが一般的なスウィズリング システムを提供します。ただし、多くの場合、参照のツリー構造やリスト構造などの単純化された仮定を使用してスウィズリングを実行できます。
スウィズリングには次のような種類があります。
- 自動スウィズリング
- オンデマンドスウィズリング
潜在的なセキュリティ上の弱点
セキュリティ上、アンスウィズリングとスウィズリングは細心の注意を払って実装する必要があります。特に、攻撃者が特別に細工したファイルを提示すると、想定される適切な境界外のアドレスにアクセスできる可能性があります。メモリ保護が弱いシステムでは、機密データの漏洩や実行される可能性のあるコードの変更につながる可能性があります。システムがデータ実行に対するガードを実装していない場合、さまざまな種類のマルウェアのインストールによってシステムが深刻な危険にさらされる可能性があります。
保護方法には、データをアプリケーションにリリースする前の検証が含まれます。
- すべてのオフセットが読み取られたデータの範囲内にあること。
- インデックスのテーブルとそれが指すレコードも同様に制約されます。
- 識別子は一意であり、機密情報の場合は暗号化されます。
- すべての可変長データは、実際の割り当てを超えない長さに制限されます。
- 割り当て額が適切な規模であること。
- 読み取られたデータがロードされていない割り当てはクリアされるか、特定のパターンでロードされます。
参照
- 再配置、ポインタ変更の積極的な形式
参考文献
さらに読む
- Wilson, Paul R. (1991-07-01) [1991 年 6 月]。「ページ フォルト時のポインタ スウィズリング: 標準ハードウェア上での巨大なアドレス空間の効率的なサポート」。ACM SIGARCH Computer Architecture News。第 19 巻、第 4 号。6 ~ 13 ページ。doi :10.1145/122576.122577。
- Kemper, Alfons; Kossmann, Donald ( 1995 年 7 月)。「オブジェクト ベースにおける適応型ポインタ スウィズリング戦略: 設計、実現、定量分析」(PDF)。国際大規模データベース ジャーナル。4 (3): 519–567。doi : 10.1007 /BF01231646。S2CID 4556203。2008年 7 月 25 日にオリジナルから アーカイブ(PDF) 。2021年 12 月 8 日に取得。(49ページ)
- クロフォード、デレク(1992年6月)。デレクのABC of C。第2巻。340~343ページ。
