User space memory layout
Linux employs a lazy allocation strategy for user space, only mapping physical pages of memory when the program accesses it. For example, allocating a buffer of 1 MiB using malloc(3)
returns a pointer to a block of memory addresses but no actual physical memory. A flag is set in the page table entries such that any read or write access is trapped by the kernel. This is known as a page fault. Only at this point does the kernel attempt to find a page of physical memory and add it to the page table mapping for the process. It is worthwhile demonstrating this with a simple program, MELP/Chapter18/pagefault-demo
:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/resource.h> #define BUFFER_SIZE (1024 * 1024) void print_pgfaults(void) { Â Â Â Â Â int ret; Â Â Â Â Â struct rusage usage; Â Â Â Â Â ret = getrusage(RUSAGE_SELF, &usage); Â Â Â ...