問題タブ [mprotect]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 無料通話をする前に保護をリセットする必要がありますか
malloc
とを介していくつかの大きなメモリ チャンクを割り当てaligned_alloc
、次に を使用して、メモリ内の 1 ページ サイズの領域にフェンスを設定しましたmprotect
。
今、私はメモリを使い果たしfree(buf);
、それを解放するために呼び出しています.私の質問は、次のように、mprotect
呼び出す前にリセットする必要がありますか?free
それとも私はやるべきfree
ですか?glibc は以前に割り当てられたメモリの一部を再利用することがあると読んだので、このメモリ領域が後で返された場合malloc
、アクセスすると問題が発生しPROT_NONE
ますか?
c - 複数のスレッドでの mprotect の動作
並行/並列 GC の目的で、mprotect syscall によって提供されるメモリ順序の保証 (つまり、複数のスレッドでの mprotect の動作または mprotect のメモリ モデル) に興味があります。私の質問は(コンパイラの並べ替えがない、または十分なコンパイラバリアがあると仮定して)です
スレッド 1 がスレッド 2 の mprotect によってアドレスで segfault をトリガーした場合、スレッド 1 の segfault のシグナル ハンドラで syscall が確認される前に、すべてがスレッド 2 で発生することを確認できますか? スレッド 1 でロードを実行する前に、完全なメモリ バリアがシグナル ハンドラに配置されるとどうなるでしょうか。
スレッド 1 が、スレッド 2 によって PROT_NONE に設定されたアドレスで揮発性ロードを実行し、セグメンテーション違反をトリガーしなかった場合、これは 2 つの間の関係の前に発生するのに十分ですか。または別の言い方をすれば、2 つのスレッドが実行する場合 (
*ga
として開始され0
、p
読み取り専用で開始されたページ アライン アドレスです)a
スレッド 2 が になるという保証はあります1
か? (スレッド 1 で segfault が観察されず、他のコードが変更されないと仮定します*ga
)
私は主に Linux の動作、特に x86(_64)、arm/aarch64、および ppc に関心がありますが、他のアーキテクチャ/OS に関する情報は歓迎されます (Windows の場合、mprotect を VirtualProtect に置き換えるか、それが何と呼ばれるものでも....)。これまでのところ、x64 および aarch64 Linux での私のテストでは、これらの違反は示唆されていませんが、私のテストが決定的であるかどうか、または動作が長期的に信頼できるかどうかはわかりません.
mprotect
一部の検索では、許可が削除されたときにアドレスがマップされたすべてのスレッドで TLB シュートダウンを発行する可能性があることが示唆されています。将来のカーネル コードの最適化によって、この保証が破られる可能性がある場合。
1週間前にこれについて尋ねたLKMLの投稿を参照してください。まだ返信はありません...
編集:質問についての明確化。私は、tlb の撃墜が私が探している保証を提供する必要があることを認識していましたが、そのような動作が信頼できるかどうかを知りたいです。言い換えれば、そのようなリクエストがカーネルによって発行される理由は何ですか。何らかの順序保証を提供するためでなければ必要ないからです。
c - 複数のスレッドで共有される割り当てられたメモリを書き込みから保護する
私たちのアプリケーション (ネットワーク デーモン) では、ヒープに割り当てられたメモリをおよそ 3 つの用途で使用しています。
アプリケーションのグローバル構成の解析結果を保持するために起動時に割り当てられるメモリ。
スレッドが作成されるときにスレッド固有のデータに割り当てられるメモリ (およびスレッドが破棄されるときに解放される)。
リクエストを処理するときに割り当てられ、リクエストの有効期間にバインドされたメモリ。
3 つのケースすべてで、talloc を使用してメモリを管理します。
最近、1 つ以上のスレッドがグローバル構成に書き込みを行ってクラッシュを引き起こしていることを意味する不適切なポインター値が原因で、メモリ破損の問題が発生しました。
アプリケーションが構造化されているため、アプリケーションがリクエストの処理を開始した後は、ケース 1) で割り当てられたメモリに何も書き込まないでください。
ケース1)で割り当てられたメモリを読み取り専用としてマークする方法はありますか?