34得票2回答
x86-64架构中的红色区域确切位置在哪里?

来自维基百科: 在计算机中,红区是函数栈帧中一个固定大小的区域,超出返回地址范围,该函数不予保留。调用者函数可以利用红区存储本地变量,而无需修改堆栈指针。这段内存区域不得由中断/异常/信号处理程序修改。System V使用的x86-64 ABI规定了128字节的红区,它直接开始于返回地...

28得票4回答
为什么内核代码不能使用红区?

在创建x86_64平台的64位内核时,强烈建议指示编译器不要使用用户空间ABI使用的128字节红区(对于GCC编译器,编译器标志是-mno-red-zone)。 如果启用了红区,内核将无法中断安全。 但是,为什么会这样?

25得票5回答
内联汇编破坏红区

我正在编写一个加密程序,其中核心部分(一个宽乘例程)是用x86-64汇编语言编写的,旨在提高速度,并且因为它广泛使用像adc这样不易从C中访问的指令。我不想内联此函数,因为它很大,并且在内部循环中被调用多次。 理想情况下,我还想为此函数定义自定义调用约定,因为它在内部使用所有寄存器(除了rs...

17得票1回答
为什么x86-64 GCC函数序言分配的堆栈比本地变量少?

考虑以下简单程序:int main(int argc, char **argv) { char buffer[256]; buffer[0] = 0x41; buffer[128] = 0x41; buffer[255] = 0...

17得票2回答
在C++内联汇编中使用基指针寄存器

我希望能够在内联汇编中使用基址指针寄存器 (%rbp)。一个玩具示例可以如下所示:void Foo(int &x) { asm volatile ("pushq %%rbp;" // 'prologue' "movq %%rs...

15得票4回答
Java虚拟机从堆栈红区进行无效访问

我正在尝试弄清楚Java中可能导致此错误的原因:Invalid access of stack red zone 0x115ee0ed0 rip=0x114973900 有没有人遇到过这个错误消息?它会让JVM崩溃,然后一切都停止了。 我目前正在使用这个Java版本:(在OS X 10.6上...

14得票2回答
为什么这个函数序言中没有"sub rsp"指令,而函数参数存储在负rbp偏移量处?

通过阅读一些内存分段文档,我了解到:当调用函数时,有几个指令(称为函数序言)会将帧指针保存在堆栈上,将堆栈指针的值复制到基本指针中,并为局部变量保留一些内存。 这是我正在尝试使用GDB调试的一个简单代码:void test_function(int a, int b, int c, int ...

13得票2回答
为什么在没有后续函数调用的情况下,使用GCC分配大数组时会将错误值从堆栈指针减去?

真是一件奇怪的gcc怪事。看看这个:main() { int a[100]; a[0]=1; } 生成以下汇编: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rb...

12得票1回答
编译器在不调整RSP的情况下使用本地变量

在问题“编译器:理解从小程序生成的汇编代码”中,编译器使用了两个本地变量而没有调整堆栈指针。 在使用本地变量时不调整RSP似乎不具有中断安全性,因此编译器似乎依赖于硬件在发生中断时自动切换到系统堆栈。否则,第一个到达的中断将把指令指针推入堆栈并覆盖本地变量。 来自该问题的代码为:#incl...

7得票2回答
我该如何告诉gcc我的内联汇编会破坏部分栈?

考虑像这样的内联汇编: uint64_t flags; asm ("pushf\n\tpop %0" : "=rm"(flags) : : /* ??? */); 尽管获取RFLAGS内容可能具有某种内在性质,但我该如何告诉编译器我的内联汇编会破坏堆栈顶部的一个四字节内存?