Linux

除了使用系統呼叫時,我們何時跳轉到程序虛擬記憶體的核心部分?(在 Linux 中)

  • April 18, 2021

這是我上一個問題的後續問題

根據答案,系統呼叫是我們跳轉到程序虛擬記憶體的核心部分的一個例子。

  1. 除了系統呼叫之外,使用這部分虛擬記憶體的普通程序(非核心)還有哪些其他範例?比如有沒有直接跳轉到這個核心部分的函式呼叫或者..?
  2. 當我們跳轉到這部分記憶體時,處理器是否自動將核心模式位設置為 1 以便我們的程序訪問這部分,還是不需要設置該位?
  3. 這個核心部分內部的所有執行是否都不需要上下文切換到核心程序?

(我不想在評論中問這些後續問題,所以我打開了另一個執行緒。)

在此處輸入圖像描述

  1. 在使用者模式下執行的程序根本無法訪問核心的地址空間。處理器切換到核心模式和執行核心程式碼有多種方式,但它們都是由核心設置並發生在明確定義的上下文中:執行系統呼叫、響應中斷或處理故障。系統呼叫不涉及直接呼叫核心程式碼;它們涉及一種特定於體系結構的機制,要求 CPU 將控制權轉移給核心,以代表呼叫程序執行由其編號標識的特定係統呼叫。LWN 有一系列文章解釋其工作原理:系統呼叫剖析 第一部分第二部分附加內容

如果一個程序試圖訪問核心地址空間中的記憶體,它將切換到核心模式,但由於故障;然後核心將終止具有分段衝突的程序 ( SIGSEGV)。

在 32 位 x86 上,有一種使用遠呼叫、呼叫門切換到核心模式的機制;但Linux不使用它。(而且它們依賴於特殊的程式碼段描述符,而不是呼叫核心地址。) 2. 見上文:你不能跳入核心記憶體。在上述情況下,當轉換到核心模式時,CPU 檢查是否允許轉換,如果允許,則使用適合所使用架構的任何機制切換到核心模式。在 x86 Linux 上,這意味著從 ring 3 切換到 ring 0。 3. 轉換到核心模式不涉及程序的更改,所以是的,所有這一切都發生在沒有上下文切換的情況下(由核心計算)。

引用自:https://unix.stackexchange.com/questions/473824