相关疑难解决方法(0)

为什么内核代码不能使用Red Zone

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

如果启用了内核,则内核不会是中断安全的.

但那是为什么呢?

x86-64 abi red-zone

18
推荐指数
3
解决办法
2874
查看次数

当我们有一个红区时,为什么我们需要堆栈分配?

我有以下疑惑:

正如我们所知,System V x86-64 ABI为我们提供了堆栈帧中固定大小的区域(128字节),即所谓的redzone.因此,结果我们不需要使用,例如,sub rsp, 12.只是做mov [rsp-12], X,这就是全部.

但我无法理解这一点.为什么这有关系?sub rsp, 12没有redzone 是否有必要?毕竟,堆栈大小在开始时是有限的,为什么sub rsp, 12重要?我知道这使得我们可以跟随堆栈的顶部但是让我们忽略它.

我知道一些指令使用了什么rsp价值(比如ret)但在那一刻并不关心它.

问题的症结在于:我们没有红区,我们已经完成了:

function:
    mov [rsp-16], rcx
    mov [rsp-32], rcx
    mov [rsp-128], rcx
    mov [rsp-1024], rcx
    ret
Run Code Online (Sandbox Code Playgroud)

它有区别吗?

function:
    sub rsp, 1024
    mov [rsp-16], rcx
    mov [rsp-32], rcx
    mov [rsp-128], rcx
    mov [rsp-1024], rcx
    add rsp, 1024
    ret
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 abi red-zone

6
推荐指数
1
解决办法
1073
查看次数

标签 统计

abi ×2

red-zone ×2

x86-64 ×2

assembly ×1

x86 ×1