/* gcc -Wall -o memdirty memdirty.c */ #include #include #include #include #include static void usage(const char *prog, FILE * out) { fprintf(out, "usage: %s allocsize\n", prog); fprintf(out, " allocsize is kbytes, or number[KMGP] (P = pages)\n"); exit(out == stderr); } int main(int argc, char *argv[]) { long long kbtotal = 0, pages, i; unsigned offset; char *mem, *tmp; if (argc == 2) { char *end = NULL; kbtotal = strtoull(argv[1], &end, 0); switch (*end) { case 'g': case 'G': kbtotal *= 1024; case 'm': case 'M': kbtotal *= 1024; case '\0': case 'k': case 'K': break; case 'p': case 'P': kbtotal *= 4; break; default: usage(argv[0], stderr); break; } } if (argc != 2 || kbtotal == 0) usage(argv[0], stderr); pages = kbtotal / 4; errno = 0; printf("[%d] allocating %lld kbytes, %lld pages\n", getpid(), kbtotal, pages); mem = calloc(pages, 4096); perror("calloc"); if (mem == NULL) exit(1); offset = 0; while (1) { for (i = 0; i < pages; i++) { tmp = (mem + (i * 4096)) + (offset++ & (4096 - 1)); *tmp = *tmp + 1; } } return 0; }