Kernel

當我在 Linux 中呼叫 printf 之類的函式時,虛擬記憶體中究竟發生了什麼?

  • October 8, 2018

我在詢問許多程序可能使用的諸如 printf 之類的函式,並且還需要核心的幫助來處理諸如係統呼叫之類的事情。

發生了什麼的詳細分步描述是什麼?因為我在這方面有點困惑,所以我有這些問題:

  1. printf 函式的指令是否在我們使用者程序的核心部分中?當它嘗試執行 printf 時,我們在同一個使用者程序中對那個核心位置執行 JMP,但是我們進入核心模式?或者是否有上下文切換和核心程序執行此操作?
  2. 當它們在虛擬記憶體中呼叫 printf 時,執行 printf 等函式的所有程序是否都映射到相同的物理記憶體位置?
  3. 總的來說,非核心程序使用虛擬記憶體的核心部分的情況有哪些?

在此處輸入圖像描述

  1. printfC 庫實現,它不是核心的一部分。(核心確實或多或少有自己的等價物,但這對使用者程序不可用。)所以使用者程序呼叫printf不會立即呼叫核心。如果printf’ 的輸出被寫入¹,則通過呼叫 來實現write,這由核心處理(嗯,C 庫中有一個小的包裝器,但它是最小的);該程序呼叫相應的系統呼叫,並將控制切換到核心,但仍在同一程序的上下文中。
  2. 來自執行檔或庫的程式碼頁只載入一次到記憶體中(對於相同版本的底層文件),所以是printf的,如果它由同一個庫提供,則映射到相同的物理地址。
  3. 虛擬記憶體的核心部分只能從核心程式碼訪問。

¹ 嚴格來說,printf將其輸出寫入緩衝區,該緩衝區可能不會寫入任何地方。

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