来自维基百科: 在计算机中,红区是函数栈帧中一个固定大小的区域,超出返回地址范围,该函数不予保留。调用者函数可以利用红区存储本地变量,而无需修改堆栈指针。这段内存区域不得由中断/异常/信号处理程序修改。System V使用的x86-64 ABI规定了128字节的红区,它直接开始于返回地...
在创建x86_64平台的64位内核时,强烈建议指示编译器不要使用用户空间ABI使用的128字节红区(对于GCC编译器,编译器标志是-mno-red-zone)。 如果启用了红区,内核将无法中断安全。 但是,为什么会这样?
我希望能够在内联汇编中使用基址指针寄存器 (%rbp)。一个玩具示例可以如下所示:void Foo(int &x) { asm volatile ("pushq %%rbp;" // 'prologue' "movq %%rs...
我正在尝试弄清楚Java中可能导致此错误的原因:Invalid access of stack red zone 0x115ee0ed0 rip=0x114973900 有没有人遇到过这个错误消息?它会让JVM崩溃,然后一切都停止了。 我目前正在使用这个Java版本:(在OS X 10.6上...
通过阅读一些内存分段文档,我了解到:当调用函数时,有几个指令(称为函数序言)会将帧指针保存在堆栈上,将堆栈指针的值复制到基本指针中,并为局部变量保留一些内存。 这是我正在尝试使用GDB调试的一个简单代码:void test_function(int a, int b, int c, int ...
考虑像这样的内联汇编: uint64_t flags; asm ("pushf\n\tpop %0" : "=rm"(flags) : : /* ??? */); 尽管获取RFLAGS内容可能具有某种内在性质,但我该如何告诉编译器我的内联汇编会破坏堆栈顶部的一个四字节内存?