COW and mprotect on non-shared memory

David Schultz das at FreeBSD.ORG
Fri Aug 8 01:01:24 PDT 2003


On Thu, Aug 07, 2003, Ed L Cashin wrote:
> "Luoqi Chen" <lchen at briontech.com> writes:
> 
> [Ed writes]
> >> That means that if I do this:
> >> 
> >>     for (i = 0; i < n; ++i) {
> >>       assert(!mprotect(p, pgsiz, PROT_NONE));
> >>       assert(!mprotect(p, pgsiz, PROT_READ|PROT_WRITE|PROT_EXEC));
> >>       p[i] = i & 0xff;
> >>     }
> >> 
> >> ... I get n minor page faults!  Pretty amazing, but I guess they
> >> figured nobody does that.  
> 
> ...
> > The first mprotect() removes the physical mapping from the page
> > table, the second mprotect() doesn't do anything because the mapping
> > isn't there. So when the page is accessed, a fault is needed to
> > insert the mapping back to the page table.
> 
> OK, thanks.  I can see that in sys/i386/i386/pmap.c.  It leaves me
> wondering what MAP_ENTRY_COW is for, though.

It's an optimization that makes the map entries and corresponding
vm_objects themselves copy-on-write.  Specifically, when a process
forks, FreeBSD does not allocate new shadow objects immediately.
This is deferred until the object needs to be modified, which is
usually never if the process subsequently calls exec.


More information about the freebsd-hackers mailing list