#include #include #include #include #include #include #include #include int main(int argc, char **argv) { struct timespec ts_100s = { .tv_sec = 100 }; long mbytes, cnt; void *map, *p; int fd = -1; int flags; if (argc < 2 || (mbytes = atol(argv[1])) <= 0) { fprintf(stderr, "test-membloat SIZE_IN_MBYTES [FILENAME]\n"); return 1; } if (argc >= 3) { fd = open(argv[2], O_CREAT|O_TRUNC|O_RDWR, S_IRWXU); if (fd < 0) { perror("open"); return 1; } if (ftruncate(fd, mbytes << 20)) { perror("ftruncate"); return 1; } flags = MAP_SHARED; } else { flags = MAP_ANONYMOUS | MAP_PRIVATE; } map = mmap(NULL, (size_t)mbytes << 20, PROT_READ | PROT_WRITE, flags, fd, 0); if (map == MAP_FAILED) { perror("mmap"); return 1; } for (p = map, cnt = 0; p < map + (mbytes << 20); p += 4096) { *(volatile unsigned long *)p = 0xdeadbeef; cnt++; } printf("faulted in %ld mbytes, %ld pages\n", mbytes, cnt); while (1) nanosleep(&ts_100s, NULL); return 0; }