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)中返回
    系统调用会给内核足够的时间退出页面。特别是在内存压力很大的情况下。或者如果函数使用大量堆栈空间,它们可能会保持较低的页面处于热状态,最终返回调用树可能会从一段时间未触及的页面加载返回地址嗯,如果这个过程没有睡眠