2013-09-21 56 views
7

我正在研究一個小的x86內核。我正在訪問並嘗試讀取GRUB在多引導標題中提供的內存映射。我有一個Intel i3 cpu和4 GiB的RAM。這臺機器上運行時,我讀了下面的內存映射:內存映射顯示比物理內存更多的內存

--Base Address--   --Length--  --Type-- 

0x0000000000000000  0x000000000009d000  0x1 
0x000000000009d000  0x0000000000003000  0x2 
0x00000000000e0000  0x0000000000020000  0x2 
0x0000000000100000  0x00000000bb53f000  0x1 
0x00000000bb63f000  0x0000000000080000  0x2 
0x00000000bb6bf000  0x0000000000100000  0x4 
0x00000000bb7bf000  0x0000000000040000  0x3 
0x00000000bb7ff000  0x0000000000001000  0x1 
0x00000000bb800000  0x0000000004800000  0x2 
0x00000000e0000000  0x0000000010000000  0x2 
0x00000000feb00000  0x0000000000004000  0x2 
0x00000000fec00000  0x0000000000001000  0x2 
0x00000000fed10000  0x0000000000004000  0x2 
0x00000000fed18000  0x0000000000002000  0x2 
0x00000000fed1b000  0x0000000000005000  0x2 
0x00000000fee00000  0x0000000000001000  0x2 
0x00000000ffe80000  0x0000000000180000  0x2 
0x0000000100000000  0x0000000038000000  0x1 

當我起來總可用內存方面,我得到...

爲0x1(可選) - 3893.8 MIB

這似乎是正確的,留下最後200ish MiB爲其他設備保留。 唯一的問題是總的其他存儲器類型:

0X2,0x3,爲0x4 - 331.5 MIB

把我的內存總量爲4225.3 MIB或略高於4.1吉布,這引導我到我的問題:

  1. 爲什麼我總共超過4GiB的RAM,當我只有4GiB安裝?

  2. 爲什麼內存映射0x0000000100000000中的最後一個基地址?只有4GiB的RAM,32位應該是解決所有問題所需的最大地址大小。我在這裏誤解了什麼嗎?

+0

許多地址範圍不一定是真實的存儲器,它們可映射到DMA /顯示/等。 –

+0

確實如此,但這是否會造成對.875 GB的需求超出32位範圍? – Joel

回答

2

的幾點思考:

  • 地址空間=物理內存的大小。
  • i3支持64位或具有36位PAE的32位模式(可選,內核支持)的虛擬地址空間。如果在引導的32位系統中實際上有4GiB的RAM,則必須啓用PAE。如何檢查:https://serverfault.com/q/247080
  • AFAIR,這些範圍可能會重疊並以任何順序出現,因此需要對最受限制的類型或範圍拆分進行排序和重新輸入。
  • 最後一個基地址0x0000000100000000> = 2^32。通常這是因爲硬件,ROM映像和其他特殊範圍分配在(所有)個人電腦中的2^32以下。因此,需要PAE或長模式來訪問從2^32或更高開始的主存區。

編輯:

在這裏尋找更多詳情:http://wiki.osdev.org/Detecting_Memory_%28x86%29

編輯2:

今天,我偶然發現了一個的Sysinternals工具,這顯示了在我的EFI系統的物理範圍映射,沒有任何相關設置被改變。如可以看到的,所有64GiB主存儲器的在0x100000000映射,就在2^32:

Sysinternals RamMap on Win 7/ASUS EFI BIOS

+0

我沒有啓用PAE;我需要使用64位地址來達到內存的最後部分。那麼映射到其他地方的較低範圍會導致需要高於4GiB的地址? – Joel

+0

的確,類型爲0x2,0x3,0x4的範圍導致了這種情況。如何創建映射取決於系統固件。通常情況下,還有'內存漏洞',這就是爲什麼比預期更多的內存映射到4G以上的原因。 – Sam

+0

是的,我在想這件事,因爲在4GiB上映射的映射幾乎是900Mb。它能真正解釋那麼多嗎? – Joel