將 .bss 部分用作靜態堆棧是否安全?
(這是在 x86-64 Linux 的上下文中。)
我正在嘗試編寫一個高可靠性的使用者態執行檔,並且我可以完全控制生成的程序集。我不想依賴自動堆棧分配,所以我想把堆棧放在一個已知的位置。假設我計算出我的程序最多使用 414 字節的堆棧空間(完全正確)。在 .bss 部分分配 414 個字節並將 RSP 指向頂部是否安全?我想確保堆棧管理在任何時候都不會觸及該區域之外的字節。
雖然我可以確定我的程序不會在該區域之外寫入,但我需要進行一些系統呼叫(使用
syscall
指令),並且我認為至少部分核心程式碼在呼叫可執行上下文中執行。它會破壞我的堆棧嗎?此外,程序中的任何一點都可能發生中斷,“紅區”背後的故事似乎表明,中斷處理程序可以隨意寫入 RSP-128 之外的任意大區域,可能會破壞我的數據。我對這種行為有哪些保證?
在 .bss 部分分配 414 個字節並將 RSP 指向頂部是否安全?
由於您正在控制執行檔的所有內容,並且可能沒有連結到任何庫,所以這應該沒問題。值得注意的是,該
MAP_STACK
mmap
標誌 目前無效,任何可讀寫的頁面都可以用於堆棧。至少部分核心程式碼在呼叫可執行上下文中執行
是的,系統呼叫在呼叫程序中執行,但是……
它會破壞我的堆棧嗎?
…核心在自己的堆棧上執行- 否則使用者空間可能會在系統呼叫執行期間更改核心內部的值!它不會觸及使用者空間堆棧,儘管一些系統呼叫確實關心堆棧(
clone
特別是)。此外,程序中的任何一點都可能發生中斷,“紅區”背後的故事似乎表明,中斷處理程序可以隨意寫入 RSP-128 之外的任意大區域,可能會破壞我的數據。我對這種行為有哪些保證?
硬體中斷也使用它們自己的堆棧,所以你在那裡也很安全。為了保護自己免受信號處理程序的影響,您可以使用
sigaltstack
.