3

誰かが割り当てメモリアドレスへの書き込みを検出する方法を知っているかどうか尋ねたい.

最初に、sigaction と一緒に mprotect を使用して、書き込み/読み取り操作が行われたときにセグメンテーション違反を強制しました。

いくつかの中で、このアプローチの2つのマイナス要因:

  • セグメンテーションフォールトを通過するのが難しい
  • mprotect のメモリ アドレス パスは、ページ境界に揃える必要があります。つまり、このメモリ アドレスを単純な malloc で処理することはできません。

問題を明確にするには:

クラスター環境用に C でアプリを構築します。ある時点で、ローカルホストでバッファを呼び出してデータを割り当てるメモリを割り当てます。このバッファはリモート ノードに送信され、同じ手順になります。同じ時点で、このバッファはリモート ノードで書き込み/読み取りが行われますが、いつ (DMA を使用してバッファの書き込み/読み取りを行うか) はわかりません。ローカル ホストには、バッファの変更について通知する必要があります。上で言ったように、私はすでにいくつかのメカニズムを使用しましたが、それらのどれも何らかの能力でそれを処理することはできません. 今のところ、アイデアが欲しいだけです。

ここでのさまざまなアイデアは大歓迎です。

ありがとう

4

1 に答える 1

1

ハードウェア ブレークポイントを使用できます。欠点は、これがハードウェア固有であり、限られた数のブレークポイントしか設定できないことです。また、ほとんどの場合、そのような機能はタスク固有のものではないため、プログラムの複数のインスタンスを実行すると、使用可能な「スロット」の数が共有されます。

x86 アーキテクチャには、ハードウェア メモリ ブレークポイントの設定に使用できるデバッグ レジスタがあります ( http://en.wikipedia.org/wiki/X86_debug_registerを参照)。

これをテストしたい場合は、GDB を使用してハードウェア ブレークポイントを設定できます。GDB の「watch」コマンドを使用して、変数にハードウェア メモリ ブレークポイントを設定できます。

デバッグレジスタを使用mprotect()することは、あなたが求めている仕事を成し遂げるための単なる方法であることに注意してください.メモリ管理を行うための健全なエンジニアリングプラクティスではないと思います(おそらくここでやろうとしていること)。より高いレベルで何をしようとしているのかについて、もう少し説明できるかもしれません: http://catb.org/esr/faqs/smart-questions.html#goal

于 2012-05-22T13:39:24.563 に答える