Linux 进程中的信号处理程序代码是否已分页?

Linux 进程中的信号处理程序代码是否已分页?,linux,linux-kernel,signals,Linux,Linux Kernel,Signals,我有一个关于linux信号处理机制的问题。当一个信号要传递给一个进程时,内核设置进程堆栈(使用sys_sigreurn成功地对内核进行syscall),然后执行sysexit/sysret跳转到进程的注册信号处理程序。我想知道当内核执行sysret时,如果存在信号处理程序代码的页面被调出会发生什么?内核在执行环0代码时不会出现页面错误,对吗? 内核是否总是将进程信号处理代码固定在内存中 内核根本不知道哪些页面包含信号处理代码(它只知道一个入口地址),也不可能将所有这些页面都固定在RAM上。不需要

我有一个关于linux信号处理机制的问题。当一个信号要传递给一个进程时,内核设置进程堆栈(使用sys_sigreurn成功地对内核进行syscall),然后执行sysexit/sysret跳转到进程的注册信号处理程序。我想知道当内核执行sysret时,如果存在信号处理程序代码的页面被调出会发生什么?内核在执行环0代码时不会出现页面错误,对吗?
内核是否总是将进程信号处理代码固定在内存中

内核根本不知道哪些页面包含信号处理代码(它只知道一个入口地址),也不可能将所有这些页面都固定在RAM上。不需要,因为信号处理代码不是环0代码。对。我明白。这就是我所说的情况。Sysret是环0指令。Sysret试图跳转到环3中的某个位置。如果包含信号处理代码的页面恰好被调出,Sysret指令将导致页面错误,因为它试图访问没有映射的页面。然后会发生什么?不,
sysret
不会导致页面错误。它不访问任何内存,只修改程序计数器并更改权限级别。当CPU试图读取下一条指令时,会出现页面错误,但此时特权级别已更改为环3。顺便说一句,据我所知,如果您非常小心,环0中可能会出现页面错误。@n.m.:对于Linux内核,IIRC内核模式下的页面错误应该有一个相关的异常表,例如:来自_user()的副本_可能会出现页面错误,并跳转到相关的异常处理程序,从而将错误返回到-EFAULT。但这一切都是出于记忆,所以不要太相信我。