Генерировать основные ошибки страницы

Возможно ли генерировать основные ошибки страницы в ядре Linux по своему усмотрению? Может ли программа быть написана так, чтобы она гарантировала серьезную ошибку страницы при ее выполнении.

Чтобы произвести основные ошибки страницы, вам необходимо принудительно считывать данные с диска. Следующий код отображает файл, указанный в командной строке, сообщая ядру, что он ему не нужен; если файл достаточно большой (выберите большой файл в /usr/bin ), вы всегда получите основные ошибки страницы:

 #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; } 

Существует не так много способов обработки ошибок, это просто для демонстрации идеи. В моей системе,

 gcc majorfault.c -o majorfault && /usr/bin/time -v ./majorfault /usr/bin/git-annex 

всегда производит 154 основных сбоя страницы.

Эта программа C заставляет график давления памяти на моем Mac шипить PDQ:

 #include <stdlib.h> int main(void) { while (1) { char* p = malloc(1 * 1024 * 1024 * 1024); for (int i = 0; i < 1024; ++i) { p[i * 1024 * 1024] = 0; /* touch the pages */ } } return 0; } 

Важна внутренняя петля. Если вы не коснетесь хотя бы некоторых страниц памяти, которые вы выделяете, подсистема управления памятью достаточно умна, чтобы понять, что вы просто запрашиваете память, которую вы никогда не используете. Тем не менее, это может быть специфическая для реализации OS X.