Linuxプロセスのアドレス空間内のすべてのページを(プロセス自体の内部から)書き込み保護する方法があるかどうか疑問に思っています
mprotect()
。「すべてのページ」とは、実際には、ユーザーモードで実行されている通常のプログラムによって書き込まれる可能性のあるプロセスのアドレス空間のすべてのページを意味します。つまり、プログラムテキスト、定数、グローバル、およびヒープですが、私は定数、グローバル、ヒープだけで満足するでしょう。スタックを書き込み保護したくない-それは悪い考えのようです。
1つの問題は、書き込み保護メモリをどこから始めればよいかわからないことです。特定のpidで使用されているメモリのセクションを示すを見ると/proc/pid/maps
、それらは常にアドレス
0x08048000
とプログラムテキストで始まっているように見えます。(Linuxでは、私が知る限り、プロセスのメモリは、下部にプログラムテキストがあり、その上に定数があり、次にグローバル、次にヒープ、そしてサイズに応じてさまざまなサイズの空きスペースが配置されています。ヒープまたはスタックの先頭に移動し、スタックが仮想アドレスのメモリの先頭から下に向かって成長します0xffffffff
。)ヒープの先頭がどこにあるかを確認する方法があります(を呼び出すとsbrk(0)
、現在の「ブレーク」へのポインタが返されます。つまり、ヒープの最上部)ですが、実際にはヒープがどこから始まるかを知る方法ではありません。
休憩まですべてのページを保護しようとすると0x08048000
、最終的にmprotect: Cannot allocate memory
エラーが発生します。とにかくなぜメモリを割り当てるのかわかりませんmprotect
-そしてGoogleはあまり役に立ちません。何か案は?
ちなみに、これをやりたいのは、プログラムの実行中に書き込まれるすべてのページのリストを作成したいからです。これを行うために考えられる方法は、すべてを書き込み保護することです。ページを作成し、書き込みを試行すると書き込み障害が発生するようにしてから、ページをリストに追加して書き込み保護を削除する書き込み障害ハンドラーを実装します。保護するページとその方法を理解できれば、ハンドラーの実装方法を知っていると思います。
ありがとう!