#define _POSIX_C_SOURCE 200809L #include #include #include #include #ifndef PAGE_SIZE #define PAGE_SIZE sysconf(_SC_PAGE_SIZE) #endif #define BLOCK (128*PAGE_SIZE) void *alloc_huge(size_t n, int c) { char *vm; size_t i; int fd; FILE *f; f = tmpfile(); if (!f) return 0; fd = fileno(f); if (n & (BLOCK-1)) n = (n & -BLOCK) + BLOCK; vm = mmap(0, n, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (vm == MAP_FAILED) goto fail1; if (ftruncate(fd, 128*PAGE_SIZE) < 0) goto fail2; for (i=0; iBLOCK && mmap(vm+n-2*BLOCK, 2*BLOCK, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0) == MAP_FAILED) goto fail2; memset(vm, c, BLOCK); if (n > BLOCK) { memset(vm+BLOCK, c, BLOCK); memset(vm+n-2*BLOCK, c, 2*BLOCK); } return vm; fail2: munmap(vm, n); fail1: fclose(f); return 0; }