let write_access ptable page_nb =
  let entry = entry_address ptable page_nb in
   match mode_of_int memory.(entrywith
  | 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;;