let write_access ptable page_nb = let entry = entry_address ptable page_nb in match mode_of_int memory.(entry) with | UN -> raise (Page_fault page_nb) (* unallocated *) | COW -> (* copy on write *) let entry = entry_address ptable page_nb in let old_page = memory.(entry+1) in if free_pages.(old_page) = 1 then set_entry entry RW old_page else begin let new_page = new_page () in set_entry entry RW new_page; copy_page old_page new_page; decr_ref_page old_page end | _ -> ();; (* write access *) let set ptable address v = let page_nb = address / page_size in write_access ptable page_nb; let offset = address mod page_size in let entry = entry_address ptable page_nb in let real_address = memory.(entry+1) * page_size + offset in memory.(real_address) <- v;; |