6

mprotect()ページを読み取り専用にするなど、メモリーページを保護するために使用されます。プロセス全体に対してこの保護を設定します。つまり、ページが読み取り専用の場合、どのスレッドもそのページに書き込むことはできません。スレッドごとに異なる方法でページを保護する方法はありますか? たとえば、1 つのスレッドがページ P に書き込むことができ、プログラム内の他のすべてのスレッドは P からのみ読み取ることができます。

4

2 に答える 2

1

新しい Intel CPU では、メモリ保護キー [1] を使用して、プロセス内のスレッドごとに異なるアクセス設定を行うことができます。Linux では、およびフラグを実行lscpuして確認します。pkuospke

マニュアル ページ [2] の例は、対応するシステム コールを手動で呼び出す必要がなくなったという意味で少し古くなっています。代わりに、glibc は次の API 呼び出しを提供します。

  • 新しいキーを割り当てる pkey_alloc() (16 個が利用可能)
  • pkey_set() は、指定されたキーの許可を設定します
  • 特定のメモリ領域にキーを適用するための pkey_mprotect()
  • キーを解放する pkey_free()

保護キーごとに許可ビットを保持するレジスタはスレッド ローカルであるため、スレッドごとに異なる保護設定が可能です。プロテクション キー設定は、一般設定をさらにロックダウンするだけで、命令フェッチには影響しません。

[1] https://www.kernel.org/doc/Documentation/x86/protection-keys.txt

[2] http://man7.org/linux/man-pages/man7/pkeys.7.html

于 2019-07-08T17:09:33.787 に答える