2

fork()のユースケースに興味があります。

1)フォーク後、カーネルは子プロセス用の新しいPCBを作成します。親のすべてのページテーブルエントリの権限を読み取り専用に変更します。次に、親のページディレクトリとテーブルを新しい子PCBにコピーします。これは正しいです?または、親子プロセスはそれらを共有しますか?

2)カーネルは、ページをコピーした後にすべてのページを読み取り専用に変更した場合、ページの実際のアクセス許可をどのように知るのですか?

4

1 に答える 1

2

1) の意見は正しいと思います。fork() の間、カーネルは子プロセス用の新しい task_struct を作成し、mm_struct とページ テーブルをコピーし、clone_flags に依存する親プロセスとリソースを共有します。また、is_cow_mapping() である MMU エントリを無効にし、関連するページ テーブル エントリを読み取り専用にマークします。

2) に対する答え: カーネルは is_cow_mapping() が読み取り専用に変更するページ テーブル エントリのみを変更します。子または親がこれらのアドレス範囲にアクセスする場合、カーネルは複製され、読み取り/書き込みにマークされます。

fork() の後に exec() が呼び出されると、まったく新しい仮想空間がセットアップされ、親からコピーされた古いものは破棄されます。

于 2013-03-11T03:07:42.240 に答える