mmap
in C?
The functions malloc
, free
and friends are not system calls. They are library functions. Under the hood, the system calls they use are mmap
and munmap
. (Older implementations use brk
or brk
; I’ll cover that in future.)
The mmap
syscall lets the program manipulate virtual memory. The address space is divided into a number of pages. (On my machine, each page is 4096 bytes long.) Each page can be mapped to some underlying resource. Here, we use mmap
to map a page of virtual address space to a block of hardware memory. (mmap
can also map the page to a file, which can be a much more convenient interface to file manipulation.)
Here’s an example:
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
int main(void) {
size_t pagesize = getpagesize();
printf("System page size: %zu bytes\n", pagesize);
char * region = mmap(
(void*) (pagesize * (1 << 20)), // Map from the start of the 2^20th page
pagesize, // for one page length
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_ANON|MAP_PRIVATE, // to a private block of hardware memory
0,
0
);
if (region == MAP_FAILED) {
perror("Could not mmap");
return 1;
}
strcpy(region, "Hello, world!");
printf("Contents of region: %s\n", region);
int unmap_result = munmap(region, 1 << 10);
if (unmap_result != 0) {
perror("Could not munmap");
return 1;
}
// getpagesize
return 0;
}
This prints:
% ./a.out
System page size: 4096 bytes
Contents of region: Hello, world!
I wrote this because I felt like it. This post is my own, and not associated with my employer.
Jim. Public speaking. Friends. Vidrio.