2010-06-08 54 views
0

該圖像提供了一個關於虛擬地址空間的好照片。但它只說了一半的故事。它只給出用戶地址空間的完整圖片,即...降低50%(或在某些情況下降低75%)。需要完整的虛擬地址空間圖片

剩下的50%(或25%)是由內核佔用的。我知道內核也有很多不同的東西,比如內核模塊,設備驅動程序,核心內核本身。必須有某種佈局是正確的?

它的佈局是什麼?如果你說它的操作系統依賴。我會說,Linux有兩個主要的操作系統Windows &。請給出任何一個答案。

alt text http://img690.imageshack.us/img690/2543/virtualadressspace.gif

+2

我要告訴你一個壞消息拍攝照片。你想要的東西不能提供。它不僅取決於操作系統,還取決於正在使用的操作系統版本。此外,您的用戶地址空間圖也不完整,取決於您使用的編譯器以及它的版本。 – 2010-06-08 04:04:21

+1

只有兩個主要的操作系統? – 2010-06-08 04:12:23

+0

@JUST我正確的意見:'另外,你的用戶地址空間圖也是不完整的':怎麼回事?我一直認爲這是完整的。 &這怎麼依賴於編譯器?我認爲這隻取決於操作系統。 – claws 2010-06-08 06:00:39

回答

2

我有你更壞的消息,這裏還有由操作系統的安全功能明確隨機內核地址佈局的特徵。這在大多數最近的Windows和OpenBSD中都是默認的,也是Linux的一個選項。

1

就像用戶在這裏說的,你的照片不完整。它傾向於看起來特定於單線程操作系統。特別是在這個過程中可能有數百個線程(因此 - 共享相同的地址空間),每個人都有自己的堆棧。

此外,我相信地址空間的實際圖片可能會有很大的不同,取決於操作系統版本和一些細微的變化。

0

從您的問題或圖像中不完全清楚,但使用「系統地址空間」可能意味着2GB-4GB之間的區域。這確實佔據了理論上4GB空間的一半,但有一個合理的理由。

通常使用32位,您可以尋址4 GB的內存(2^32 = 4294967296),因此擁有4 GB的地址空間似乎是合乎邏輯的,而不是2 GB。這樣做的原因是: 假設你有2個三分球,這樣在C/C++:

char *ptr1; 
char *ptr2; 

我現在想知道有什麼區別的兩個指針之間,就像這樣:

offset = ptr2 - ptr1; 

'offset'的數據類型應該是什麼? 如果我們不知道ptr1是否在ptr2之前,反之亦然,偏移量可以是正數也可以是負數。現在,如果ptr1或ptr2的範圍在0 - 2GB之間,那麼偏移總是在-2147483648和+2147483647之間,這完全符合4字節有符號整數。

但是,如果ptr1和ptr2能夠訪問完整的4 GB地址空間,則偏移量將介於-4294967296和+4294967295之間,不再適合4字節有符號整數。

如果您確定自己從未在應用程序中進行過這種計算,或者您確定如果您減去2個指針,它們將永遠不會超過2 GB(或者您的向量總是小於2 GB),你可以告訴鏈接器(Windows,Visual Studio)你的應用程序是LARGEADDRESSAWARE。此鏈接器標誌在可執行文件中設置了一些位,如果32位Windows正確引導(在XP上必須使用/ 3GB引導),則Windows爲您提供了3GB而不是2GB(僅用於LARGEADDRESSAWARE可執行文件)。 其餘1GB仍用於操作系統數據結構(但我沒有關於它們的詳細信息)。

如果您運行的是64位Windows,那麼情況會變得更加有趣,因爲LARGEADDRESSAWARE可執行文件將獲得4GB的內存。顯然,操作系統數據結構現在存儲在應用程序使用的4GB以外的64位地址空間的某處。

希望澄清一下。