2010-08-31 96 views
1

衆所周知,在32位Windows操作系統下運行的程序只有2GB的虛擬內存可用。另外也知道其他2GB被保留爲內核空間。但是,內核空間實際上是什麼?內核內存在Windows操作系統中包含什麼?

我能理解內核本身需要的預留空間,但是爲什麼內核空間在VAS的過程中呢?謝謝。

+5

請爲自己說說話。我們的64位用戶有更多的地址空間供我們使用。 :) – cHao 2010-08-31 15:22:34

回答

9

獲取Windows內部的書,它描述了血腥的細節。爲簡短摘要雖然,一些事情是在內核的虛擬地址(KVA)空間:

1)內核和HAL

2)的設備驅動程序

3)內核模式堆(所謂行政池,我總是覺得有趣)

4)通過手柄(進程,線程,事件,互斥等對象)

5)系統PTE,它映射所有出口到用戶模式的對象種類有趣的東西遠離gr ubby用戶模式應用程序(例如執行堆棧的線程在內核模式下運行時)

6)文件系統緩存

使用這樣的例子不勝枚舉和...就像我說的,閱讀Windows內部。

斯科特

+0

不要誤解我的意思,但例如內核將位於進程VAS之外。設備驅動程序。也許你誤解了我的問題。我明確表示2GB被保留用於引用作爲內核的操作系統使用,但是在進程增值服務器內部。你列表中的很多東西都會被關閉。 – 2010-08-31 19:54:07

+1

@ b-gen-jack-o-neill:2GB實際上是內核自身內存的映射 - 包含本答案中提到的所有內容。它在每個過程中被相同地映射。 – caf 2010-09-01 01:18:18

+1

caf是正確的,那*是* 2GB是什麼。我提到的所有內容都在2GB映射到每個進程中。 -scott – snoone 2010-09-01 12:06:02

1

計劃寫在高級語言,如C++,最終轉換爲OS API調用,具體的Windows API的Windows操作系統。許多Windows API,如CreateFile,實際上都是與內核模式驅動程序交談的。進程地址空間中的內核空間用於爲此進程分配內核資源。例如,驅動程序IOCTL調用包含在用戶模式API和驅動程序之間傳遞的輸入輸出緩衝區。這些緩衝區分配在進程內核空間中。

通常,內核空間包含由內核模式組件代表此進程分配的資源。

+0

也非常好的答案。那麼在內核地址空間中是否包含驅動程序正確指定並與應用程序通信所需的進程重要結構? – 2010-08-31 19:56:50

+0

@ b-gen - 你讓自己過於複雜,其中一些評論沒有幫助(我在刪除了一大堆答案之後才決定編寫這個答案)。只需獲取Windows內部或任何驅動程序開發書並閱讀它。如果有不明確的地方,請提出具體問題。它會更好地爲您做好準備。 – snoone 2010-09-01 12:16:50

1

你的問題似乎是「爲什麼」而不是「標題中提到的」是什麼。

此外,你的問題假設32位。 64位版本的Windows是完全不同的(例如,VAS是8TB,或者itanium系統上的7TB)。

至於「爲什麼」,你將如何傳遞來自內核函數(如驅動程序)的指針,這些指針並不包含在進程的VAS中?一本很好的書可以解決這個問題:Windows Internals.

+0

我喜歡你的答案。 OK,所以你說它部分例如通過CPU MMU中的換頁來傳遞可變塊,從而逃避進程地址空間?所以限制是爲了防止解僱任何有效的流程頁面? – 2010-08-31 19:55:39

2

在我看來,關於2GB邊界還有一個鮮爲人知的事實。許多應用程序通常使用大量指針運算(尤其是使用C,C++編寫的應用程序...)。在這些應用程序中,向指針添加偏移量,甚至是減去指針是很常見的。

如果您的可用虛擬地址空間爲2GB,則可以保證減去兩個指針總是在-2147483647和+2147483648之間(這些是32位有符號值的限制)。

如果您的地址空間爲3GB,則可能的差異將大於可以用32位有符號值表示的任何值。

如果你知道你的應用程序是安全的,而不是減去完全無關的指針(並且你的數組小於2GB!),你可以告訴Windows應用程序可以使用大於2GB的地址空間,方法是設置鏈接器標誌LARGEADDRESSAWARE(或使用EDITBIN實用程序進行設置)。

對於XP(對Vista和W7不太確定),您可以啓動到'內核空間'僅爲1GB的模式,虛擬地址空間中的3GB留給應用程序。如果您的應用程序是LARGEADDRESSAWARE,則會獲得完整的3GB。如果沒有,你只能得到2GB。

在64位Windows上,LARGEADDRESSAWARE 32位應用程序甚至獲得4GB,因爲Windows在32位區域中不需要大量地址空間(畢竟它是64位操作系統)。

+0

在64位應用程序中,LARGEADDRESSAWARE標誌默認設置。獲取您的地址空間量取決於您的Windows版本和版本。 (在Win7 Pro中,最多可以有8TB,但系統中只能有192GB的實際內存 - 其餘的必須是交換文件或映射文件。) – cHao 2010-08-31 16:55:50

3

內核內存映射到每個進程的虛擬地址空間的原因是,上下文切換到內核模式不需要更改進程頁表。目前的特權級別僅提升到0,這立即使這些頁面可訪問。

僅當切換到不同的進程時才必須切換頁表。由於這是一項昂貴的操作(例如它需要TLB刷新),所以將其頻率降至最低是一個勝利。

此外,如果你確實切換到特殊的內核頁表,你切換到內核空間,你必須選擇一部分用戶空間地址空間來替換。這會使得那些用戶空間無法訪問內核,這將需要反彈緩衝區或更多的地址空間,以避免將這些區域中的數據傳輸到內核或從內核傳輸數據。