gpt4 book ai didi

x86-64 - 为什么内核代码不能使用红区

转载 作者:行者123 更新时间:2023-12-03 13:28:24 24 4
gpt4 key购买 nike

强烈建议在创建 64 位内核(用于 x86_64 平台)时指示编译器不要使用用户空间 ABI 所做的 128 字节红色区域。 (对于 GCC,编译器标志是 -mno-red-zone )。

如果启用,内核将不是中断安全的。

但这是为什么呢?

最佳答案

引用 AMD64 ABI:

The 128-byte area beyond the location pointed to by %rsp is considered to be reserved and shall not be modified by signal or interrupt handlers. Therefore, functions may use this area for temporary data that is not needed across function calls. In particular, leaf functions may use this area for their entire stack frame, rather than adjusting the stack pointer in the prologue and epilogue. This area is known as the red zone.



本质上,这是一种优化——用户态编译器确切地知道在任何给定时间使用了多少红色区域(在最简单的实现中,局部变量的整个大小)并且可以调整 %rsp相应地,在调用子函数之前。

特别是在叶函数中,这可以产生一些不必调整的性能优势 %rsp因为我们可以确定在函数中不会运行不熟悉的代码。 (POSIX 信号处理程序可能被视为协同程序的一种形式,但您可以指示编译器在信号处理程序中使用堆栈变量之前调整寄存器)。

在内核空间中,一旦您开始考虑中断,如果这些中断对 %rsp 做出任何假设| ,他们很可能是不正确的 - 关于红区的利用没有确定性。因此,您要么假设所有这些都是脏的,并且不必要地浪费堆栈空间(有效地在每个函数中使用 128 字节保证局部变量运行),要么保证中断不对 %rsp 做出任何假设。 - 这很棘手。

在用户空间中,上下文切换 + 128 字节的堆栈过度分配会为您处理。

关于x86-64 - 为什么内核代码不能使用红区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25787408/

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