2016-04-27 100 views
0

我對內核或系統編程非常陌生,處理虛擬地址空間和內核地址空間?怎麼樣?

我有幾個與虛擬內存有關的問題。主要與靜態與運行時間有關[即ELF和加載/鏈接等],具體到linux-x86。

我的理解可能是完全錯誤的......

我知道的虛擬內存,它的分裂1G/3G。在用戶模式下進程無法訪問PAGE_OFFSET之上的地址 - PAGE_OFFSET是虛擬地址。

在靜態時間ELF定義進程虛擬空間?

  1. 如果ELF定義的虛擬地址空間,然後做ELF還定義了內核的虛擬地址空間?怎麼樣?我假設內核虛擬地址空間在運行時動態映射?

  2. 如果內核地址空間映射到進程地址空間,那麼爲什麼進程大小(虛擬)也包含內核大小呢?

    • 何時以及如何將此內核地址空間映射/鏈接? 像,在共享庫的情況下,特定的文件被vm結構等指向。
    • 是否當代碼流遇到系統調用?例如。
  3. 可執行文件大小是否完全決定進程大小(虛擬)?在什麼情況下有所不同或者完全不同。

任何解釋整體流程的文章?

編譯 - >鏈接/負載 - >虛擬內存結構(內核地址空間/共享對象等)

我知道它很龐大的,但對整體流程的說明會工作。

+0

在一篇文章中有太多問題,其中一些問題('內核是否僅爲用戶進程使用虛擬地址)在很多時候被問過。 – Tsyvarev

+0

一些答案我在這裏和其他帖子.. http://stackoverflow.com/questions/14540656/why-kernel-needs-virtual-addressing ..... 編輯帖子相應 –

回答

1

大多數系統爲內核和用戶地址空間定義邏輯地址範圍。在某些系統中,範圍完全取決於操作系統(它是如何設置頁表的),而在其他系統上則是硬件完成的。

對於前者,頁表通常是嵌套的。在這種情況下,多個頁面表共享相同的條目。

對於後者,用戶和內核地址空間通常有單獨的頁表。

如果ELF定義了虛擬地址空間,那麼ELF是否也定義了內核虛擬地址空間?怎麼樣? [我假設內核虛擬地址空間在運行時動態映射?]

可執行文件只定義了用戶地址空間的初始佈局。

如果內核地址空間映射到進程地址空間,那麼爲什麼進程大小(虛擬)還包括內核大小呢?

這將取決於系統以及它如何進行計數。

何時以及如何將此內核地址空間映射/鏈接?類似的,在共享庫的情況下,特定文件被vm結構等指向。

內核地址空間獨立於任何進程而存在。如上所述,通過讓所有進程共享系統頁表或由所有進程共享嵌套頁表項,將其映射到進程。

可執行文件大小是否完全確定進程大小(虛擬)?在什麼情況下有所不同或者完全不同。「

不是。大型可執行文件指示需要更大範圍的邏輯地址。但是,一個小EXE可以很容易地描述大量的需求零頁。另外,應用程序可以在邏輯頁面執行時映射它們。 EXE只定義了邏輯地址空間的初始狀態。

+0

謝謝user3344003。明白了!其基本上看起來像init進程初始映射到內核頁表/目錄映射高地址上的內核地址空間,剩下的進程只是將這些條目複製到自己的頁表/目錄中。 [在linux 32位] http://www.tldp.org/LDP/khg/HyperNews/get/memory/linuxmm.html –