75 lines
1.6 KiB
C
75 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <sys/mman.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
|
|
/* This program allocates memory with multiple calls to remap. This
|
|
* can be used to verify if the remap api is working correctly. */
|
|
|
|
#define PAGE_SHIFT 12
|
|
|
|
#define ROUND_PAGES(memsize) ((memsize >> (PAGE_SHIFT)) << PAGE_SHIFT)
|
|
|
|
int main(int argc, char *argv[]) {
|
|
unsigned int memsize;
|
|
char *mem;
|
|
int i, numpages, fd;
|
|
|
|
if (argc != 2) {
|
|
printf("Usage: %s <memory_size>\n", argv[0]);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
memsize = strtoul(argv[1], NULL, 10);
|
|
|
|
memsize = ROUND_PAGES(memsize);
|
|
|
|
/* We should be limited to < 4G so any size other than 0 is ok */
|
|
if (memsize == 0) {
|
|
printf("Invalid memsize\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
numpages = memsize >> PAGE_SHIFT;
|
|
|
|
mem = mmap(0, memsize, PROT_READ | PROT_WRITE,
|
|
MAP_PRIVATE | MAP_ANONYMOUS,
|
|
-1, 0);
|
|
|
|
if (mem == (void*) -1) {
|
|
perror("Failed to allocate anon private memory using mmap\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
for (i = 2; i <= 16; i <<= 1) {
|
|
mem = mremap(mem , memsize * (i >> 1),
|
|
memsize * i,
|
|
1 /* MREMAP_MAYMOVE */);
|
|
|
|
if (mem == MAP_FAILED) {
|
|
perror("Failed to remap expand anon private memory\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
printf("Successfully remapped %d bytes @%p\n",
|
|
memsize * i, mem);
|
|
}
|
|
|
|
if (munmap(mem, memsize * 16)) {
|
|
perror("Could not unmap and free memory\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
mem = mmap(0, memsize, PROT_READ | PROT_WRITE,
|
|
MAP_PRIVATE | MAP_ANONYMOUS,
|
|
-1, 0);
|
|
|
|
if (mem == (void*) -1) {
|
|
perror("Failed to allocate anon private memory using mmap\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
exit(EXIT_SUCCESS);
|
|
}
|