Kernel
當我在 Linux 中呼叫 printf 之類的函式時,虛擬記憶體中究竟發生了什麼?
我在詢問許多程序可能使用的諸如 printf 之類的函式,並且還需要核心的幫助來處理諸如係統呼叫之類的事情。
發生了什麼的詳細分步描述是什麼?因為我在這方面有點困惑,所以我有這些問題:
- printf 函式的指令是否在我們使用者程序的核心部分中?當它嘗試執行 printf 時,我們在同一個使用者程序中對那個核心位置執行 JMP,但是我們進入核心模式?或者是否有上下文切換和核心程序執行此操作?
- 當它們在虛擬記憶體中呼叫 printf 時,執行 printf 等函式的所有程序是否都映射到相同的物理記憶體位置?
- 總的來說,非核心程序使用虛擬記憶體的核心部分的情況有哪些?
printf
由C 庫實現,它不是核心的一部分。(核心確實或多或少有自己的等價物,但這對使用者程序不可用。)所以使用者程序呼叫printf
不會立即呼叫核心。如果printf
’ 的輸出被寫入¹,則通過呼叫 來實現write
,這由核心處理(嗯,C 庫中有一個小的包裝器,但它是最小的);該程序呼叫相應的系統呼叫,並將控制切換到核心,但仍在同一程序的上下文中。- 來自執行檔或庫的程式碼頁只載入一次到記憶體中(對於相同版本的底層文件),所以是
printf
的,如果它由同一個庫提供,則映射到相同的物理地址。- 虛擬記憶體的核心部分只能從核心程式碼訪問。
¹ 嚴格來說,
printf
將其輸出寫入緩衝區,該緩衝區可能不會寫入任何地方。