1

カーネルレベルでオン/オフできるページテーブルエントリにビットがあるため、読み取りおよび/または書き込みアクセスのページを保護することが可能です。メモリの特定の領域を書き込みアクセスから保護する方法はありますか。たとえば、C 構造体に書き込み保護が必要な特定の変数があり、それらへの書き込みアクセスによってセグメンテーション違反とコア ダンプがトリガーされるとします。mprotect() の縮小機能のようなものは、ページ レベルで機能するため、ユーザー空間のバイト レベルで同様のメカニズムがあります。

ありがとう、カピル・ウパダヤイ。

4

2 に答える 2

5

いいえ、そのような施設はありません。データ オブジェクトごとの保護が必要な場合は、オブジェクトごとに少なくとも 1 ページを割り当てる必要があります (を使用mmap)。オブジェクト (配列の場合) の末尾を超えたアクセスに対する保護も必要な場合は、必要な数よりも少なくとも 1 ページ多く割り当て、オブジェクトがページ境界で終了するように整列し、を使用mprotectしてオブジェクトを保護することができます。割り当てた 1 つまたは複数の追加ページ。

もちろん、この種のアプローチは非常に遅く、多くのリソースを浪費するプログラムになります。デバッグ手法以外ではおそらく実行可能ではなく、valgrind は、プログラムを変更することなく、より効果的にそのニーズを満たすことができます...

于 2011-09-21T07:19:36.180 に答える
4

1 つの方法は、非常に遅いですが、オブジェクトがあるページ全体を保護することです。そのページへの書き込みアクセスが発生するたびに、無効なページ アクセスのカスタム ハンドラーが呼び出され、ページの保護をすばやく解除してデータを書き込み、ページを再度保護することで状況を解決します。

これはシングルスレッド プログラムでは問題なく機能しますが、マルチスレッド プログラムではどうすればよいかわかりません。

このアイデアはおそらく新しいものではないので、何らかの情報や既製の実装を見つけることができるかもしれません.

于 2011-09-21T07:25:08.890 に答える