アドレス空間の複製
Rev.8を表示中。最新版はこちら。
作成中fork()でプロセスを生成する場合、vm_map_fork()でアドレス空間をコピーする。
この時、アドレス空間は複製するが物理ページは複製されずfork()元のプロセスと共有し、ページへ書込みを行なった時点で複製される(Copy On Write)。
物理ページはCopy On Writeで共有するが、vm_map_fork()ですぐにはShadow Objectを作成はしない。vm_map_fork()直後ではvm_map_entryのみ複製させてvm_objectは直接共有している(図1)。ただし、Shadow Objectを作成すべきvm_map_entryにはneeds_copyにTRUEが設定される。
needs_copy == TRUEだとvm_map_wire_nested(),vm_map_lookup_locked()などで適宜Shadow Objectが作成される。Shadow Objectが作成されると図2、3のようになる。
共有しているページを書き換えようとするとページフォルトが発生して

図1 vm_map_fork()直後

図2 プロセスAのShadow Objectが作成された状態

図3 プロセスBのShadow Objectが作成された状態
vmmap
VM Object