[英]Under what circumstances does control pass from userspace to the Linux kernel space?
我試圖了解哪些事件可以導致從用戶空間到Linux內核的轉換。 如果相關,則此問題的范圍可以限制為x86 / x86_64體系結構。
以下是我所知道的一些過渡源:
我在這里問兩件事:
你遺失的一個: 例外
(可以在故障,陷阱和中止中進一步細分)
例如頁面錯誤,斷點,除零或浮點異常。 從技術上講,可以將異常視為中斷,但不是您在問題中定義中斷的方式。
您可以在此osdev網頁上找到x86例外列表。
關於你的第二個問題:
這些上下文切換涉及哪些代碼路徑?
這實際上取決於架構和操作系統,您需要更具體。 對於x86,當發生中斷時,您轉到IDT條目,對於SYSENTER
您將轉到MSR中指定的地址。 之后發生的事情完全取決於操作系統。
沒有人寫完整的答案,所以我會嘗試將評論和部分答案納入答案。 隨意評論或編輯答案以改進它。
出於這個問題和答案的目的,用戶空間到內核轉換意味着處理器狀態的變化,允許訪問內核代碼和內存。 簡而言之,我將這些轉換稱為上下文切換。
在討論可以觸發用戶空間到內核轉換的事件時,重要的是使用上下文切換來分離我們習慣的OS構造(信號,系統調用,調度)以及這些構造的實現方式。
在x86中,上下文切換有兩種中心方式:中斷和SYSENTER
。 中斷是處理器功能,在某些事件發生時會導致上下文切換:
INT 0x80
。 調試斷點也是使用中斷實現的,調試INT 0x3
替換指令。 這種類型的中斷稱為軟件中斷。 SYSENTER
是一條指令,它提供現代路徑,以便在執行系統調用的特定情況下進行上下文切換。
可以在arch/x86/kernel/entry_{32|64}.S
找到處理由於Linux中的中斷或SYSENTER
而導致的上下文切換的代碼。
在許多情況下,更高級別的Linux構造可能會導致上下文切換。 這里有一些例子:
int 0x80
或sysenter
指令,則發生上下文切換。 某些系統調用例程可以使用用戶空間信息來獲取系統調用要獲取的信息。 在這種情況下,不會發生上下文切換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.