即使页表条目已存在,我也想故意生成页面错误。
所以我清除了Collections
位以生成页面错误。
这是我写的内核代码:
_PAGE_PRESENT
但是,此代码不起作用。我想要的页面错误不会发生。我想确切地知道如何触发页面错误。
谢谢。
答案 0 :(得分:0)
@Jungsik Choi,当你为当前页面设置NOT PRESENT标志时,你破坏了页面表项,实际上将标志改为NOT PRESENT什么也没做,只是改变了标志。所以你的页面仍然存在。通过以这种方式设置NOT PRESENT标志,您将损坏PTE,而不会导致页面错误。
如果要观察页面错误,则需要强制从磁盘读取。下面的代码映射了命令行中给出的文件,告诉内核它不需要它;如果文件足够大(在/ 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个主要页面错误。