fork()のユースケースに興味があります。
1)フォーク後、カーネルは子プロセス用の新しいPCBを作成します。親のすべてのページテーブルエントリの権限を読み取り専用に変更します。次に、親のページディレクトリとテーブルを新しい子PCBにコピーします。これは正しいです?または、親子プロセスはそれらを共有しますか?
2)カーネルは、ページをコピーした後にすべてのページを読み取り専用に変更した場合、ページの実際のアクセス許可をどのように知るのですか?
1) の意見は正しいと思います。fork() の間、カーネルは子プロセス用の新しい task_struct を作成し、mm_struct とページ テーブルをコピーし、clone_flags に依存する親プロセスとリソースを共有します。また、is_cow_mapping() である MMU エントリを無効にし、関連するページ テーブル エントリを読み取り専用にマークします。
2) に対する答え: カーネルは is_cow_mapping() が読み取り専用に変更するページ テーブル エントリのみを変更します。子または親がこれらのアドレス範囲にアクセスする場合、カーネルは複製され、読み取り/書き込みにマークされます。
fork() の後に exec() が呼び出されると、まったく新しい仮想空間がセットアップされ、親からコピーされた古いものは破棄されます。