書き込み保護された仮想ページ、書き込みをキャッチ
-
03-07-2019 - |
質問
書き込み保護されたページへの書き込みをキャッチする方法はありますか?
オブジェクトをコピーしてインスタンス化する、自己のようなオブジェクトシステムを実行する予定です。 (他の部分と比較してシンプルでコンパクトなものに聞こえるから)明らかに、この目的のために作成されたオブジェクトは何らかの方法で書き込み保護されるべきです。 ELFのプログラムヘッダーから書き込み保護されているものにフラグを立てる方法があるのを見ました。 (RE、RWE、RW -flags)
これは書き込み保護を提供しますか?私はそれがセグメンテーション違反を起こすはずだと覚えていますが、これは本当ですか?書き込み保護されたページへの書き込みをキャッチする方法。これは私が望んでいるものを実装するのに良い方法ですか?それより良い方法はありますか?
解決
はい、 mprotect を使用できます。
はい、保護されたメモリへの書き込みはセグメンテーション違反を起こします。ハンドラーをインストールできます。 C ++の場合:
std::signal(SIGSEGV, my_segv_handler_func);
これはあなたがやりたいことをするもっともらしい方法ですが、それを機能させるには多くの余分な管理グーを追加する必要があります。たとえば、この種の書き込み検出はハードウェアで行われ、x86アーキテクチャでは4kのページサイズがあります。したがって、一般的な「アドレスXで開始してNバイトになる」のではなく、4Kの境界に合わせて一度に4Kを保護できます。
- オブジェクトをページにマッピングします そのようなことを確認できるように ページへの書き込みは、への書き込みです 特定の保護オブジェクト、または
- 常に独自のmallocをロール 4kの境界に割り当てます。これにより、 割り当てられた最小ブロックサイズ4k
より良い方法があるかどうかは頭の外ではわかりませんが、遊ぶのは楽しいですね。 :)
所属していません StackOverflow