#include #include #include #include #define NENTRIES 70000 int main(void) { char *base; size_t i, pgsz; pid_t pid; pgsz = getpagesize(); base = mmap(NULL, NENTRIES * pgsz, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); if (base == MAP_FAILED) err(1, "mmap"); /* Alternate protections so each page is its own map entry. */ for (i = 1; i < NENTRIES; i += 2) if (mprotect(base + i * pgsz, pgsz, PROT_READ) != 0) err(1, "mprotect"); pid = fork(); if (pid == -1) err(1, "fork"); if (pid == 0) { /* Make sure the child faults at least once. */ base[0] = 1; _exit(0); } if (waitpid(pid, NULL, 0) == -1) err(1, "waitpid"); return (0); }