簡體   English   中英

控制在什么情況下從用戶空間傳遞到Linux內核空間?

[英]Under what circumstances does control pass from userspace to the Linux kernel space?

我試圖了解哪些事件可以導致從用戶空間到Linux內核的轉換。 如果相關,則此問題的范圍可以限制為x86 / x86_64體系結構。

以下是我所知道的一些過渡源:

  • 系統調用(包括訪問設備)導致從用戶空間到內核空間的上下文切換。
  • 中斷將導致上下文切換。 據我所知,這還包括調度程序搶占,因為調度程序通常依賴於計時器中斷來完成其工作。
  • 信號。 似乎至少有一些信號是使用中斷實現的,但我不知道是否有一些信號是以不同方式實現的,所以我將它們單獨列出來。

我在這里問兩件事:

  1. 我錯過了任何用戶空間 - >內核路徑嗎?
  2. 這些上下文切換涉及哪些代碼路徑?

你遺失的一個: 例外

(可以在故障,陷阱和中止中進一步細分)

例如頁面錯誤,斷點,除零或浮點異常。 從技術上講,可以將異常視為中斷,但不是您在問題中定義中斷的方式。

您可以在此osdev網頁上找到x86例外列表。

關於你的第二個問題:

這些上下文切換涉及哪些代碼路徑?

這實際上取決於架構和操作系統,您需要更具體。 對於x86,當發生中斷時,您轉到IDT條目,對於SYSENTER您將轉到MSR中指定的地址。 之后發生的事情完全取決於操作系統。

沒有人寫完整的答案,所以我會嘗試將評論和部分答案納入答案。 隨意評論或編輯答案以改進它。

出於這個問題和答案的目的,用戶空間到內核轉換意味着處理器狀態的變化,允許訪問內核代碼和內存。 簡而言之,我將這些轉換稱為上下文切換。

在討論可以觸發用戶空間到內核轉換的事件時,重要的是使用上下文切換來分離我們習慣的OS構造(信號,系統調用,調度)以及這些構造的實現方式。

在x86中,上下文切換有兩種中心方式:中斷和SYSENTER 中斷是處理器功能,在某些事件發生時會導致上下文切換:

  • 硬件設備可能請求中斷,例如,定時器/時鍾可能在經過一定時間后導致中斷。 按下鍵時鍵盤可能會中斷。 它也被稱為硬件中斷。
  • 用戶空間可以啟動中斷。 例如,在x86上的Linux中執行系統調用的舊方法是使用通過寄存器傳遞的參數執行INT 0x80 調試斷點也是使用中斷實現的,調試INT 0x3替換指令。 這種類型的中斷稱為軟件中斷。
  • CPU本身在某些情況下會產生中斷,例如在沒有權限的情況下訪問內存時,當用戶除以零時,或者當一個核心必須通知另一個核心需要執行某些操作時。 這種類型的中斷稱為異常,您可以在@esm的答案中閱讀更多關於它們的內容。
  • 有關中斷的更廣泛討論,請參見此處: http//wiki.osdev.org/Interrupt

SYSENTER是一條指令,它提供現代路徑,以便在執行系統調用的特定情況下進行上下文切換。

可以在arch/x86/kernel/entry_{32|64}.S找到處理由於Linux中的中斷或SYSENTER而導致的上下文切換的代碼。

在許多情況下,更高級別的Linux構造可能會導致上下文切換。 這里有一些例子:

  • 如果系統調用到達int 0x80sysenter指令,則發生上下文切換。 某些系統調用例程可以使用用戶空間信息來獲取系統調用要獲取的信息。 在這種情況下,不會發生上下文切換。
  • 很多時候調度不需要中斷:線程將執行系統調用,並且系統調用的返回會延遲,直到再次調度。 對於未執行系統調用的部分中的進程,Linux依賴於計時器中斷來獲得控制權。
  • 對已分頁的內存位置的虛擬內存訪問將導致分段錯誤,從而導致上下文切換。
  • 信號通常在進程已經“切換”時發送(請參閱@caf關於問題的評論),但有時會使用處理器間中斷在兩個正在運行的進程之間傳遞信號。

暫無
暫無

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

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