2013-09-21 19 views
7

Pracuję na małym jądrze x86. Uzyskuję dostęp i próbuję odczytać mapę pamięci udostępnioną przez GRUB w nagłówku multiboot. Mam procesor Intel i3 i 4 GB pamięci RAM. Podczas pracy na tym urządzeniu, Czytam następujące mapy pamięci:Mapa pamięci pokazuje więcej pamięci RAM niż fizycznie dostępna

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

Kiedy wynieść maksymalnie dostępne obszary pamięci, mam ...

0x1 (dostępnych) - 3893.8 MiB

Co wydaje się być w porządku, pozostawiając ostatnie 200-te MiB zarezerwowane dla innych urządzeń. Jedynym problemem jest łącznie z innymi rodzajami pamięci:

0x2, 0x3, 0x4 - 331,5 MiB

Umieszczenie mi całkowitą ilość pamięci RAM, przy 4225.3 MiB lub nieco ponad 4,1 GB miejsca, co prowadzi mnie do mojego pytania:

  1. Dlaczego łącznej ponad 4GiB RAM gdy mam zainstalowane tylko 4GiB?

  2. Dlaczego ostatni adres bazowy na mapie pamięci 0x0000000100000000? Tylko 4GiB pamięci RAM, 32 bity powinny być maksymalnym rozmiarem adresu potrzebnym do adresowania tego wszystkiego. Czy coś tu nie rozumiem?

+0

Wiele zakresy adresów niekoniecznie są prawdziwe pamięć, mogą mapować DMA/wyświetlacz/etc. –

+0

Prawda, ale czy to powoduje, że potrzeba 0,875 GB poza zasięgiem 32 bitowym? – Joel

Odpowiedz

2

Niektóre myśli:

  • Przestrzeń adresowa = fizyczny rozmiar pamięci.
  • Urządzenie i3 obsługuje wirtualne przestrzenie adresowe w trybie 64-bitowym lub 32-bitowym z 36-bitowym trybem PAE (opcjonalnie, z obsługą jądra). Jeśli w systemie z 32-bitowym systemem bootowania rzeczywiście dostępne jest 4 GB pamięci RAM, należy włączyć opcję PAE. Jak sprawdzić: https://serverfault.com/q/247080
  • AFAIR, zakresy te mogą zachodzić na siebie i pojawiać się w dowolnej kolejności, dlatego wymagane jest zamówienie i ponowne wpisywanie do najbardziej ograniczonego zakresu lub podziału zakresu.
  • Ten ostatni adres bazowy 0x0000000100000000 jest> = 2^32. Zwykle robi się to, ponieważ sprzęt, obrazy ROM i inne specjalne zakresy są przydzielane poniżej 2^32 w (wszystkich?) Komputerach osobistych. Zatem do uzyskania dostępu do głównych zakresów pamięci zaczynających się od 2^32, wymagany jest tryb PAE lub tryb długi.

Edit:

Spójrz tutaj po więcej szczegółów: http://wiki.osdev.org/Detecting_Memory_%28x86%29

Edit 2:

Dzisiaj natknąłem się na narzędzie Sysinternals, co pokazuje następujący fizyczne odwzorowanie zakres dla mojego systemu EFI, bez zmiany powiązanego ustawienia. Jak widać, wszystkie 64GiB pamięci głównej jest odwzorowywany na 0x100000000, tuż przy 2^32:

Sysinternals RamMap on Win 7/ASUS EFI BIOS

+0

Nie włączałem PAE; Aby dotrzeć do ostatniej części pamięci, muszę użyć adresów 64-bitowych. Więc niższe zakresy mapowane gdzie indziej powodują potrzebę adresów powyżej 4GiB? – Joel

+0

Dokładnie, powodują to zakresy z typem 0x2,0x3,0x4. Dokładność tworzenia map zależy od oprogramowania układowego systemu. Zwykle są też "dziury w pamięci", które exmplain, dlaczego więcej pamięci niż oczekiwano jest mapowane powyżej 4G. – Sam

+0

Tak, zastanawiałem się nad tym, ponieważ istnieje prawie 900MB na mapach powyżej 4GiB. Czy to naprawdę wyjaśnia? – Joel