Linux kernel 在linux中,x86-64返回指令是否会导致页面错误?当前进程堆栈是否始终在主存中?
我知道返回指令会将“程序控制转移到位于堆栈顶部的返回地址”Linux kernel 在linux中,x86-64返回指令是否会导致页面错误?当前进程堆栈是否始终在主存中?,linux-kernel,kernel,x86-64,disassembly,page-fault,Linux Kernel,Kernel,X86 64,Disassembly,Page Fault,我知道返回指令会将“程序控制转移到位于堆栈顶部的返回地址” 当前进程的堆栈是否始终在内存中 假设我返回到自己程序中的一个函数(接近返回?),那么我能保证没有页面错误吗 如果返回将控制权传递回另一个不在内存中的段中的代码(比如上下文切换),则远返回是否会导致页面错误 关于ret或call/return,就CPU而言,或者就内核页面逐出算法而言,通常没有什么特别之处。(CPU确实有一个用于call/ret的特殊分支预测器,但这不会影响操作系统关于页面逐出的决策。) 用户空间堆栈内存是按需分页
关于
ret
或call/return,就CPU而言,或者就内核页面逐出算法而言,通常没有什么特别之处。(CPU确实有一个用于call/ret的特殊分支预测器,但这不会影响操作系统关于页面逐出的决策。)
用户空间堆栈内存是按需分页的,就像任何其他用户空间内存一样(除非您使用
mlock
)ret
从堆栈中弹出一个返回地址作为[rsp]
;这是可能导致ret自身故障的内存访问。(当然,如果ret
指令本身的代码提取出现故障)
ret成功执行后,如果从新RIP获取的代码碰巧被逐出,那么它也可能/而不是页面错误。(或者,如果调用
指令位于页面的最末尾,则返回的页面可能从未被触摸过。)
(当然,在手工编写的asm中,或使用RetPoline时,可能会有不匹配的call/ret。例如,类似于push
/ret
的内容,相当于jmp
。显然,您可以跳转到以前未触及或有一段时间未触及的页面,从而导致硬页面或软页面错误。)
就CPU而言,或者就内核页面逐出算法而言,
ret
或call/return没有什么特别之处。包含[rsp]
的页面往往很热,不会被逐出,但从长时间睡眠(100)
系统调用返回后,内核将有足够的时间逐出页面。特别是当有明显的记忆压力时。或者,如果函数使用了大量堆栈空间,它们可能会保持较低的页热,最终,返回调用树可能是从一段时间没有被触摸过的页面加载返回地址,即使进程没有休眠。对于CPU而言,关于ret或调用/返回的任何内容都不是特别的,或者对于内核页面逐出算法而言。(CPU确实为call/ret提供了一个特殊的分支预测器,但这不会影响操作系统关于页面逐出的决定。)
用户空间堆栈内存是按需分页的,就像任何其他用户空间内存一样(除非您使用
mlock
)。ret
从堆栈中弹出一个返回地址,作为[rsp]
;这是可能导致ret本身出错的内存访问。(当然,如果ret
指令本身的代码提取出错)
ret成功执行后,如果从新RIP获取的代码恰好被逐出,则它也可能/而不是页面错误。(或者如果调用指令位于页面的最末尾,则返回的页面可能从未被触摸过。)
(当然,在手工编写的asm中,或使用RetPoline时,可能会有不匹配的call/ret。例如,类似于push
/ret
的内容,相当于jmp
。显然,您可以跳转到以前未触及或有一段时间未触及的页面,从而导致硬页面或软页面错误。)
就CPU而言,或者就内核页面退出算法而言,ret
或call/return通常没有什么特别之处。包含[rsp]
的页面往往很热,不会被退出,而是从长时间的睡眠(100)中返回
系统调用会给内核足够的时间退出页面。特别是在内存压力很大的情况下。或者如果函数使用大量堆栈空间,它们可能会保持较低的页面处于热状态,最终返回调用树可能会从一段时间未触及的页面加载返回地址嗯,如果这个过程没有睡眠