gpt4 book ai didi

linux - 为什么 Linux 在进行上下文切换时会保存 %ebp?

转载 作者:可可西里 更新时间:2023-11-01 11:49:01 24 4
gpt4 key购买 nike

当进行上下文切换时,x86 Linux(非常巧妙地)避免保存和恢复 EAX、EBX、ECX、EDX、ESI 和 EDI。当然,当切换到内核模式时,用户态值会保存在内核堆栈中。但是内核代码中的值不会保存——相反,使用 GCC 指令告诉编译器不要在发生切换时保留这些寄存器中所需的任何值。 p>

ESP自然是要保存和恢复的。但这是我不明白的:在切换ESP之前,EBP被压入内核堆栈。我认为 EBP 被用作帧指针,但在我的内核调试器中,值肯定看起来不像:

(gdb) print $esp
$22 = (void *) 0xc0025ec0
(gdb) print $ebp
$23 = (void *) 0xcf827f3c

区别是方式太大,EBP 不能在这里作为帧指针。代码中的注释说“EBP 是为 wchan 访问显式保存/恢复的”,但我正在搜索代码,但无法弄清楚这是怎么回事。谷歌也没有帮助。一些内核向导可以介入并提供帮助吗?

最佳答案

The difference is way too big for EBP to be a frame pointer here.

推测您已经在未启用帧指针的情况下编译内核。查看相关配置选项:

config SCHED_OMIT_FRAME_POINTER
def_bool y
prompt "Single-depth WCHAN output"
depends on X86
---help---
Calculate simpler /proc/<PID>/wchan values. If this option
is disabled then wchan values will recurse back to the
caller function. This provides more accurate wchan values,
at the expense of slightly more scheduling overhead.

If in doubt, say "Y".

get_wchan 函数将对 ebp 值进行健全性检查,并且仅在它看起来是帧指针时才使用它。

我认为最好在两个地方都使用上面的配置标志,这样如果 ebp 不是帧指针,就不会被不必要地保存,还有 get_wchan 如果我们知道不会有帧指针就不会打扰了。也就是说,保存/恢复 ebp 只会增加很少的开销,所以这不是悲剧。

关于linux - 为什么 Linux 在进行上下文切换时会保存 %ebp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com