最近、スレッドプロセスの作品を見ていて、ここに記録するために学んでいるときにこの質問を思いつきました。
プロセスを管理するオペレーティングシステムの内部にはPCBがあり、LinuxオペレーティングシステムのPCBはtask_structです。mm_structデータ型に格納されているmmフィールド内のtask_structを見て、このことは、アドレス空間のプロセスを管理することです。異なるプロセスは、異なるアドレス空間を区別するために、この情報に依存しています。このフィールドがNULLになった後、カーネル状態に切り替えます! だから、スレッドアドレス空間のカーネル状態とユーザー状態のアドレス空間は、正確に同じではないようです。別の情報を見て、各プロセスは、カーネルの部分で自分の仮想アドレス空間を初期化するために、この情報をコピーして作成されたときに、管理するためにカーネル自体が初期化時に割り当てられるカーネルのページテーブルであることが判明しました。つまり、異なるプロセスの仮想アドレス空間内のカーネル状態のマッピングルールは同じです。PCB には、現在アクティブなプロセスの mm を記録する active_mm フィールドもありますが、カーネルレベルのスレッドの場合、それは前のカーネルスレッドの mm_struct であり、異なるプロセスのカーネルアドレス空間は同じなので、私が対応するユーザ状態の仮想アドレス空間を使用すれば完了です。





