如何引发页面错误

时间:2016-12-09 20:25:25

标签: c linux memory-management linux-kernel virtual-memory

即使页表条目已存在,我也想故意生成页面错误。

所以我清除了Collections位以生成页面错误。

这是我写的内核代码:

_PAGE_PRESENT

但是,此代码不起作用。我想要的页面错误不会发生。我想确切地知道如何触发页面错误。

谢谢。

1 个答案:

答案 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个主要页面错误。