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