(这是在 x86-64 Linux 的上下文中。)
我正在尝试编写一个高可靠性的用户态可执行文件,并且我可以完全控制生成的程序集。我不想依赖自动堆栈分配,所以我想将堆栈放在已知位置。假设我计算出我的程序最多使用 414 字节的堆栈空间(确切地说)。在 .bss 部分分配 414 字节并将 RSP 指向顶部是否安全?我想确保堆栈管理在任何时候都不会触及该区域之外的字节。
虽然我可以确定我的程序不会在该区域之外写入,我需要进行一些系统调用(使用指令syscall
),并且我认为至少部分内核代码在调用可执行上下文中运行。它会破坏我的堆栈吗?
此外,中断可能发生在程序中的任何点,“红区”背后的故事似乎表明,中断处理程序可以随意写入 RSP-128 之外的任意大区域,这可能会破坏我的数据。我对这种行为有什么保证?
答案1
在 .bss 部分分配 414 字节并将 RSP 指向顶部是否安全?
由于您正在控制可执行文件的所有内容,并且可能不链接到任何库,因此这应该没问题。尤其,旗帜MAP_STACK
mmap
目前没有效果,任何可读可写的页面都可以用于堆栈。
至少部分内核代码在调用可执行上下文中运行
是的,系统调用在调用进程内部运行,但是......
它会破坏我的堆栈吗?
...内核运行在自己的堆栈上— 否则用户空间可能会在系统调用执行期间更改内核内部的值!它不触及用户空间堆栈,尽管某些系统调用确实关心堆栈(clone
尤其)。
此外,中断可能发生在程序中的任何点,“红区”背后的故事似乎表明,中断处理程序可以随意写入 RSP-128 之外的任意大区域,这可能会破坏我的数据。我对这种行为有什么保证?
硬件中断也使用它们自己的堆栈,因此您在那里也是安全的。为了保护自己免受信号处理程序的影响,您可以使用以下命令设置专用堆栈sigaltstack
。