簡體   English   中英

x86-64 返回指令會導致 linux 中的頁面錯誤嗎? 當前進程堆棧總是在主 memory 中嗎?

[英]Can x86-64 return instruction cause a page fault in linux? Is the current process stack always in main memory?

我知道返回指令會將“程序控制權轉移到位於堆棧頂部的返回地址” (第 1205 頁)

  1. 當前進程的堆棧是否總是在 memory 中?

  2. 假設我在自己的程序中返回到 function(接近返回?),那么我能保證沒有頁面錯誤嗎?

  3. 如果返回將控制權傳遞回不在 memory 中的另一個段中的代碼(可能類似於上下文切換),那么遠返回是否會導致頁面錯誤?

就 CPU 而言,或者就 kernel 頁面驅逐算法而言,一般而言, ret或 call/return 沒有什么特別之處。 (CPU 確實有一個特殊的 call/ret 分支預測器,但這不會影響操作系統關於頁面驅逐的決策。)


用戶空間堆棧 memory 就像任何其他用戶空間 memory 一樣是按需分頁的(除非您使用mlock )。 ret從堆棧中彈出一個返回地址為[rsp] 這是 memory 訪問,可能會使 ret 本身出現故障。 (或者當然,如果ret指令本身的代碼獲取錯誤)。

在 ret 成功執行后,如果碰巧已被驅逐,則從新 RIP 獲取代碼也可能/而不是頁面錯誤。 (或者,如果call指令位於頁面的最后,則返回的頁面可能永遠不會被觸及。)

(當然,在手寫 asm 或 retpolines 中,可能會出現不匹配的 call/ret。例如push / ret等價於jmp 。顯然,您可以跳轉到以前未觸及或尚未觸及的頁面一段時間,導致硬或軟頁面錯誤。)


就 CPU 而言,或者就 kernel 頁面驅逐算法而言,一般而言, ret或 call/return 沒有什么特別之處。 包含[rsp]的頁面往往很熱,不會被驅逐,但從長時間的sleep(100)系統調用返回,會給 kernel 足夠的時間來驅逐頁面。 特別是如果 memory 壓力很大。 或者,如果函數使用大量堆棧空間,它們可能會保持較低的頁面熱,並且最終返回調用樹可能會從一段時間未觸及的頁面加載返回地址,即使進程沒有一直在睡覺。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM