#include #include #include #include #include #include #include #include #define MAX 2200UL #define output "/mnt/compil/tmp/garbage.img" int main(void) { size_t i, j, k; unsigned char *c; #ifdef __linux__ struct stat st; if (stat(output, &st) != 0 || st.st_size < (MAX << 20)) { FILE *f = fopen(output, "w+"); if (!f) error(1, errno, "fopen"); for (i = 0; i < MAX << 20; i++) { putc(i ^ (i<<12), f); } fclose(f); } #endif srandom(time(NULL)); int fd = open(output, O_RDONLY); c = mmap(NULL, MAX << 20, PROT_READ, MAP_SHARED, fd, 0); if (c == MAP_FAILED) error(1, errno, "mmap"); for (i = 10; i < MAX; i*=1.2) { printf("%d MB\n", i); #if 1 for (k = 0; k < 400000; k++) { { j = random() % (i<<20); #else for (k = 0; k < 3; k++) { for (j = 0; j < i<<20; j+=4097) { #endif unsigned char check = j ^ (j<<12); if (c[j] != check) printf("error at %x (%dMB): %x vs %x\n", j, j >> 20, c[j], check); } } } munmap(c, MAX << 20); return 0; }