Linux 在内核模式下会发生页面错误吗?

Linux 在内核模式下会发生页面错误吗?,linux,linux-kernel,Linux,Linux Kernel,据我所知,内核使用的帧没有交换到磁盘,那么在内核模式下怎么会出现页面错误呢?可能吗?什么时候?是的,它完全可以。页面错误并不像现在这样是一件“坏事”。当然,这可能意味着用户代码在试图访问无效内存时遇到了分段错误,但也可能意味着其他事情。例如,当您在映射页面后第一次写入页面时(如果映射时没有MAP\u POPULATE),就会发生页面错误。如果映射上的第一个操作作为系统调用的一部分发生,例如mmap(),那么这种错误很容易在内核代码中发生;read() 如果您想快速查看生成页面错误的内核函数,了解

据我所知,内核使用的帧没有交换到磁盘,那么在内核模式下怎么会出现页面错误呢?可能吗?什么时候?

是的,它完全可以。页面错误并不像现在这样是一件“坏事”。当然,这可能意味着用户代码在试图访问无效内存时遇到了分段错误,但也可能意味着其他事情。例如,当您在映射页面后第一次写入页面时(如果映射时没有
MAP\u POPULATE
),就会发生页面错误。如果映射上的第一个操作作为系统调用的一部分发生,例如
mmap(),那么这种错误很容易在内核代码中发生;read()

如果您想快速查看生成页面错误的内核函数,了解在内核模式下页面错误发生的不同方式,可以使用
perf
工具

下面是一个测试程序的示例:

#包括
#包括
内部主(空){
void*m=mmap(NULL,4096,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);
读取(0,m,1);
返回0;
}

从Intel CPU的角度来看:是的,这是可能的。并非所有地址都可用(映射),因此可能会出现页面错误。内核应该区分故障的来源。内核可以访问用户空间内存(例如克隆进程),因此可能导致页面错误。Linux内核将所有内核内存保留在物理内存中,只是为了简单起见,但这不是一个硬性要求


注意:异常中的页面错误(或任何其他异常)将导致双故障异常,处理方式不同,而双故障处理程序中的异常将导致三重故障,它被硬编码为CPU重置。(有时这个技巧被用来返回真实模式,希望是短期的)。

例如,在
copy{to,from}{u user
中。或者在内核错误解除对无效指针的引用的情况下。
$ gcc x.c
$ sudo perf record -e page-fault:k ./a.out
$ perf report
Samples: 4  of event 'page-faults:k', Event count (approx.): 16
Overhead  Command  Shared Object      Symbol
  87.50%  a.out    [kernel.kallsyms]  [k] copy_user_generic_unrolled
  12.50%  a.out    [kernel.kallsyms]  [k] __clear_user