![](/img/trans.png)
[英]Is there an explict split between userspace and kernel in physical memory on Linux x86-64?
[英]Can x86-64 return instruction cause a page fault in linux? Is the current process stack always in main memory?
我知道返回指令會將“程序控制權轉移到位於堆棧頂部的返回地址” (第 1205 頁) 。
當前進程的堆棧是否總是在 memory 中?
假設我在自己的程序中返回到 function(接近返回?),那么我能保證沒有頁面錯誤嗎?
如果返回將控制權傳遞回不在 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.