
アプリケーションからメモリ ページのコミットを明示的に制御することは可能ですか? 何年も前に Windows アプリケーションで、ランダムにぶら下がっている参照/ヒープ破損のバグを見つけるのに役立つ「アラーム システム」ヒープ マネージャーを作成しました。仮想メモリの大きな領域を予約し、ページを自由にコミット/デコミットすることができました。当時のアイデアは、コミットされていないページ、それに続く 1 つ以上のコミットされたページ (要求を満たすのに十分な数)、それに続く別のコミットされていないページを含むセットを作成することでした。コンパイル時のフラグを使用して、呼び出し元に返されるポインタがコミットされた領域の先頭にあるか末尾にあるかを制御します (それぞれ、アンダーライトまたはオーバーライトで例外を即座に発生させるため)。Windows には、メモリ領域を予約してページをコミットするための API が用意されています。私が作成している Linux プログラムでは、このようなブックエンド バッファーを別の用途で使用しており、カーネルが同様の機能を提供しているかどうか疑問に思っています。
答え1
あなたが言及しているのはVirtualAlloc
そして友達私の知る限りLinuxには直接同等のものはありませんが、さまざまな方法で同じ効果を得ることができます。メモリを予約したい場合は、mmap(2)
; コミットするには、書き込みを行う必要があります。デコミットするには、madvise(2)
のMADV_DONTNEED
。
ガードページを実装するには、mprotect(2)
ハンドラと一緒に使用すると、より良いオプションになりますSIGSEGV
。また、コンパイラによって提供されるオーバーフロー保護 (-fstack-protector
など、さまざまな-fsanitize
オプション) を確認することもできます。
答え2
複雑なメモリマネージャを実装するのではなく、単に自分のプログラムをデバッグしたいだけなら、次のようなプログラムを使用することをお勧めします。ヴァルグリンドメモリ リークとダングリング ポインタを検出します。