1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define _GNU_SOURCE 1 2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <sys/mman.h> 3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h> 4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdlib.h> 5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <string.h> 6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <unistd.h> 7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main(void) 9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{ 10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* first find free segment of 40K, then unmap it */ 11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void *initial_area = mmap((void *)0x10000000, 40960, PROT_READ|PROT_WRITE, 12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MAP_ANONYMOUS|MAP_PRIVATE,0,0); 13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (initial_area == MAP_FAILED) 15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng perror ("initial area"); 16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("initial_area= %p\n", initial_area); 17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (munmap(initial_area, 40960) != 0) 18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng perror ("munmap initial_area"); 19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* remap the same segment, but with 4K size */ 21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void *area = mmap(initial_area, 4096, PROT_READ|PROT_WRITE, 22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng MAP_ANONYMOUS|MAP_PRIVATE,0,0); 23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (area == MAP_FAILED) 24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng perror ("area"); 25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (area != initial_area) 26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("FAILED : was expecting to get back the initial_area\n"); 27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("area= %p\n", area); 28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng strcpy(area, "Hello World"); 29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* extend it to 40K */ 31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void *a2 = mremap(area, 4096, 40960, 0); 32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (a2 == MAP_FAILED) { 33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng perror("mremap"); 34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng } 35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng if (a2 != initial_area) 36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("FAILED : was expecting to get back the same area increased\n"); 37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("increased area= %p\n", a2); 38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng printf("%s\n", (char *)a2); 39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return 0; 40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} 41