2013-09-21 18 views
7

Küçük bir x86 çekirdeği üzerinde çalışıyorum. GRUB'un multiboot üstbilgisinde sağladığı bellek haritasını okumaya ve okumaya çalışıyorum. Intel i3 işlemci ve 4 adet RAM RAM'i var. - 3893,8 MiBBellek haritası, mevcut olandan daha fazla RAM gösteriyor

Ben kullanılabilir bellek alanları toplam zaman

--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 

, ben olsun ...

0x1 (Mevcut): Bu makinede çalışırken, aşağıdaki hafıza haritası okuyorum

Diğer cihazlar için ayrılan son 200ish MiB'yi bırakarak doğru görünüyor. tek sorun diğer bellek türleri toplamı olan:

0x2, 0x3, 0x4 - gib, 4.1 üzerinde 4225,3 MIB'den biraz az RAM zaman toplam miktarını koymak 331.5 MIB

olan sorularıma götürüyor: Neden sadece 4GiB yüklü olduğunda RAM 4GiB daha bulan ediyorum

  1. ?

  2. Neden bellek verisindeki son temel adres 0x0000000100000000? Sadece 4GiB RAM ile 32 bit, hepsine hitap etmek için gereken maksimum adres boyutu olmalıdır. Burada bir şeyi yanlış anladım mı?

+0

Birçok adresi aralıkları mutlaka gerçek bellek değildir, onlar DMA/ekran/vb eşleyebilirler. –

+0

Doğru, ancak bu 32 bit aralığın dışında olmak için .875 GB'ye ihtiyaç duyuyor mu? – Joel

cevap

2

Bazı düşünceler:

  • Adres alanı = fiziksel bellek boyutu.
  • Bir i3, 64bit veya 32bit modunda 36bit PAE (isteğe bağlı, çekirdek desteği ile) olarak sanal adres boşluklarını destekler. Önceden yüklenmiş 32bit sistemde 4GiB RAM'iniz varsa, PAE etkinleştirilmelidir. Nasıl kontrol edilir: https://serverfault.com/q/247080
  • AFAIR, bu aralıklar herhangi bir sırada üst üste gelebilir ve görünebilir, böylece en sınırlı tür veya aralık bölme için sıralama ve yeniden yazım yapılması gerekir. Bu son taban adresi 0x0000000100000000,> = 2^32'dir. Bu genellikle yapılır, çünkü donanım, ROM görüntüleri ve diğer özel aralıklar (tümü?) PC'lerde 2^32'nin altına ayrılır. Bu nedenle, 2^32 veya üstünde başlayan ana bellek aralıklarına erişmek için PAE veya uzun mod gereklidir.

Düzenleme: http://wiki.osdev.org/Detecting_Memory_%28x86%29

Düzenleme 2: Daha fazla bilgi için buraya

Bak

Bugün, benim EFI Sistemi için fiziksel aralık eşlemesi aşağıdaki gösterir bir ANNELER aracı, tökezledi, ilgili herhangi bir ayar olmadan değiştirildi. Görüldüğü gibi, 64GiB ana belleğin tamam 2^32 de, 0x100000000 de eşleştirilmiş:

Sysinternals RamMap on Win 7/ASUS EFI BIOS

+0

PAE'yi etkinleştirmedim; En son belleğe ulaşmak için 64 bit adres kullanmalıyım. Yani başka yerlerde haritalanan alt aralıklar 4GiB'nin üstündeki adreslere ihtiyaç duyuyor mu? – Joel

+0

Tam olarak, 0x2,0x3,0x4 biçimindeki aralıklar buna neden oluyor. Eşlemenin tam olarak nasıl oluşturulduğu, sistem ürün bilgisine bağlıdır. Genellikle, 'bellek delikleri' vardır, ki bu da, 4G'nin üzerinde beklenenden daha fazla belleğin neden haritalandığını açıklar. – Sam

+0

Evet Bunu merak ediyordum, çünkü 4GiB üzerinde neredeyse 900MiB haritası çizildi. Gerçekten bu kadarını açıklayabilir mi? – Joel

İlgili konular