並行/並列 GC の目的で、mprotect syscall によって提供されるメモリ順序の保証 (つまり、複数のスレッドでの mprotect の動作または mprotect のメモリ モデル) に興味があります。私の質問は(コンパイラの並べ替えがない、または十分なコンパイラバリアがあると仮定して)です
スレッド 1 がスレッド 2 の mprotect によってアドレスで segfault をトリガーした場合、スレッド 1 の segfault のシグナル ハンドラで syscall が確認される前に、すべてがスレッド 2 で発生することを確認できますか? スレッド 1 でロードを実行する前に、完全なメモリ バリアがシグナル ハンドラに配置されるとどうなるでしょうか。
スレッド 1 が、スレッド 2 によって PROT_NONE に設定されたアドレスで揮発性ロードを実行し、セグメンテーション違反をトリガーしなかった場合、これは 2 つの間の関係の前に発生するのに十分ですか。または別の言い方をすれば、2 つのスレッドが実行する場合 (
*ga
として開始され0
、p
読み取り専用で開始されたページ アライン アドレスです)// thread 1 *ga = 1; *(volatile int*)p; // no segfault happens // thread 2 mprotect(p, 4096, PROT_NONE); // Or replace 4096 by the real userspace-visible page size a = *ga;
a
スレッド 2 が になるという保証はあります1
か? (スレッド 1 で segfault が観察されず、他のコードが変更されないと仮定します*ga
)
私は主に Linux の動作、特に x86(_64)、arm/aarch64、および ppc に関心がありますが、他のアーキテクチャ/OS に関する情報は歓迎されます (Windows の場合、mprotect を VirtualProtect に置き換えるか、それが何と呼ばれるものでも....)。これまでのところ、x64 および aarch64 Linux での私のテストでは、これらの違反は示唆されていませんが、私のテストが決定的であるかどうか、または動作が長期的に信頼できるかどうかはわかりません.
mprotect
一部の検索では、許可が削除されたときにアドレスがマップされたすべてのスレッドで TLB シュートダウンを発行する可能性があることが示唆されています。将来のカーネル コードの最適化によって、この保証が破られる可能性がある場合。
1週間前にこれについて尋ねたLKMLの投稿を参照してください。まだ返信はありません...
編集:質問についての明確化。私は、tlb の撃墜が私が探している保証を提供する必要があることを認識していましたが、そのような動作が信頼できるかどうかを知りたいです。言い換えれば、そのようなリクエストがカーネルによって発行される理由は何ですか。何らかの順序保証を提供するためでなければ必要ないからです。