Para produzir falhas de página principais, você precisa forçar leituras do disco. O código a seguir mapeia o arquivo dado na linha de comando, informando ao kernel que ele não precisa dele; se o arquivo for grande o suficiente (escolha um arquivo grande em /usr/bin
), você sempre obterá falhas importantes na página:
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
int main(int argc, char ** argv) {
int fd = open(argv[1], O_RDONLY);
struct stat stats;
fstat(fd, &stats);
posix_fadvise(fd, 0, stats.st_size, POSIX_FADV_DONTNEED);
char * map = (char *) mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
perror("Failed to mmap");
return 1;
}
int result = 0;
int i;
for (i = 0; i < stats.st_size; i++) {
result += map[i];
}
munmap(map, stats.st_size);
return result;
}
Não há muito em termos de tratamento de erros, isso é apenas para demonstrar a ideia. No meu sistema,
gcc majorfault.c -o majorfault && /usr/bin/time -v ./majorfault /usr/bin/git-annex
sempre produz 154 falhas de página principais.