アプリケーションはメモリを明示的にコミットおよびコミット解除できますか?

アプリケーションはメモリを明示的にコミットおよびコミット解除できますか?

アプリケーションはメモリページの送信を明示的に制御できますか?数年前、私はWindowsアプリケーションでランダムなハング参照/ヒープ破損エラーを見つけるのに役立つ「警告システム」ヒープマネージャを作成しました。広い仮想メモリ領域を予約し、必要に応じてページをコミット/コミット解除できます。アイデアは、コミットされていないページと1つ以上のコミットされたページ(要求を満たすのに十分です)を含むコレクションを作成し、最後にコミットされていない別のページを使用して、呼び出し元に返されたポインタが場所にあるかどうかを制御します。することです。コミットされた領域の開始または終了(各引数または上書き時にすぐに例外がトリガーされる)Windowsは、メモリ領域を予約し、ページをコミットするためのAPIを提供します。私が書いているLinuxプログラムには、これらのブックエンドバッファの別の目的がありますが、カーネルが同じ種類の機能を提供しているのかどうか疑問に思います。

ベストアンサー1

私の考えでは、あなたが言っていると思います。VirtualAllocそして友達。私が知っている限り、Linuxには直接同等の機能はありませんが、いくつかの方法で同じ効果を得ることができます。メモリを予約するには、次のものを使用できます。mmap(2);コミットするには作成する必要があり、アンロードするには次のものを使用できます。madvise(2)MADV_DONTNEED

保護されたページを実装するには、次を見つけることができます。mprotect(2)ハンドラと一緒に行く方が良い選択になりますSIGSEGV。また、コンパイラが提供するオーバーフロー防止(-fstack-protectorそして何よりもさまざまな-fsanitizeオプション)を見ることもできます。

おすすめ記事