2009-11-01 84 views
9

我很想知道需要使用highmem來解決超過1GB的RAM問題。有人能指出我出錯的地方嗎?謝謝!Linux 3/1虛擬地址分割

我所知道的:

  • 1 GB一個進程的虛擬內存(高內存區域)被保留用於內核操作。用戶空間可以使用剩餘的3 GB。這是3/1分裂。

  • VM的虛擬內存功能將(連續)虛擬內存頁面映射到物理頁面(RAM)。

我不知道是什麼:

  • 什麼操作使用的內核虛擬內存?我猜想內核空間中的kmalloc(...)會使用內核虛擬內存。

  • 我認爲在這個方案下可以使用4GB的RAM。我不明白爲什麼內核1 GB虛擬空間是尋址物理空間時的限制因素。這是我理解失敗的地方。請指教。

我一直在讀這個(http://kerneltrap.org/node/2450),這很棒。但它並不完全符合我的問題,我喜歡。

+0

」有了32位,就有可能解決4GB的內存問題,但在32位系統上,Linux直到最近才被限制在內存中的數量要少得多,但是由於它設置虛擬地址的方式空間。」 - 來自LDD,第13章 我想我的問題是,爲什麼它只限於大大減少內存。 – David 2009-11-02 02:44:49

回答

9

內核虛擬空間是可用物理內存限制因素的原因是內核需要訪問所有的物理內存,訪問物理內存的方式是通過內核虛擬地址。內核不使用允許直接訪問物理內存位置的特殊指令 - 它必須爲它想要與之交談的任何物理範圍設置頁表項。

在「舊風格」的方案,內核處理事情讓每一個進程的頁表映射到虛擬地址從0xC00000000xFFFFFFFF直接到物理地址從0x000000000x3FFFFFFF(這些網頁標記,以便他們只是在訪問環0 - 內核模式)。這些是「內核虛擬地址」。在這個方案下,內核可以直接讀寫任何物理內存位置,而無需使用MMU來改變映射。

在HIGHMEM方案下,從內核虛擬地址到物理地址的映射不固定 - 物理內存的部分映射進出內核虛擬地址空間,因爲內核需要訪問該內存。這允許使用更多的物理內存,但代價是必須不斷更改虛擬到物理映射,這是一項相當昂貴的操作。 「

+0

因此,在「舊方案」下,內核模式下的任何進程都可以處理所有物理內存(包括與該特定進程無關的內存)? – David 2009-11-02 06:46:42

+3

是的,絕對的(他們仍然可以 - 有時候他們只需跳過籃圈就可以這麼做)。這是必需的 - 例如,中斷服務於中斷髮生時正在運行的任何進程的上下文中。內核有點像一個大型的共享庫,只不過它的代碼運行在一個提升的特權級別上(而且你不能直接調用它 - 你需要通過一個特殊的入口點來提高特權級別)。 – caf 2009-11-02 06:54:18

+0

因此,在我執行kmalloc(...)時的「old-scheme」下,它會分配內核虛擬內存,這真的轉換爲物理內存 - 它不會被換出到磁盤上? – David 2009-11-02 07:01:44

-2
  1. 例如系統調用使用內核空間。
  2. 您可以擁有64GB的物理內存,但在32位平臺上,由於32位虛擬尋址,處理器只能訪問4GB。實際上,你可以擁有1GB的內存和3GB的交換空間,而虛擬尋址會使它看起來像4GB。在64位平臺上,虛擬尋址實際上是無限的。
+0

Anacrolix:什麼? – Alexandru 2009-11-01 23:30:32

+0

1GB的內存和3GB的交換?這沒有任何意義......在32位機器上,根本不需要進行交換以滿足您的體系結構的尋址限制。 – 2009-11-02 00:09:31

+0

我是一個例子。 – Alexandru 2009-11-02 11:38:54

4

在每個進程中映射1 GB到內核允許進程在不執行上下文切換的情況下切換到內核模式。然後可以在調用進程的地址空間中對系統調用(如read()mmap()等)的響應進行適當處理。

如果在每個進程中沒有保留內核空間,那麼在執行用戶空間代碼之間切換到「內核模式」會更加昂貴,並且無法通過硬件MMU(內存管理單元)使用虛擬地址映射。爲系統調用提供服務。

運行內存超過1GB的32位內核的系統能夠在ZONE_HIGHMEM(大約高於1GB標記)中分配物理內存位置,這可能需要內核跳過某些操作才能與其進行交互。 PAE(物理地址擴展)的增加,通過允許高達64GB的物理內存,將1GB物理地址內存中的內存比率降低到ZONE_HIGHMEM中分配的區域,擴展了此問題。

+0

是的,有內核虛擬內存的原因很清楚。但是在HIGHMEM之前的日子裏,爲什麼內核虛擬內存空間成爲物理內存尋址的限制因素? – David 2009-11-02 00:59:10