2013-09-21 1 views
7

Je travaille sur un petit noyau x86. J'accède et tente de lire la carte de mémoire fournie par GRUB dans l'en-tête multiboot. J'ai un processeur Intel i3 et 4 GiB de RAM. Lors de l'exécution sur cette machine, je lis la carte mémoire suivante:Carte mémoire affiche plus de RAM que physiquement disponible

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

Quand je total les zones de mémoire disponible, je reçois ...

0x1 (Disponible)-3893,8 MiB

Ce qui semble à peu près juste, laissant le dernier MiB 200ish réservé aux autres appareils. Le seul problème est le total des autres types de mémoire:

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

Mettre ma quantité totale de RAM à 4225,3 MiB ou un peu plus de 4,1 Gio, qui me conduit à mes questions:

  1. Pourquoi suis-je totalisant plus de 4GiB de RAM quand je n'ai 4GiB installé?

  2. Pourquoi la dernière adresse de base dans la carte mémoire 0x0000000100000000? Avec seulement 4 Go de RAM, 32 bits devraient être la taille d'adresse maximale nécessaire pour répondre à tous. Suis-je mal compris quelque chose ici?

+0

De nombreuses plages d'adresses ne sont pas nécessairement mémoire réelle, ils peuvent à la carte DMA/affichage/etc. –

+0

True, mais cela crée-t-il un besoin de 0,875 Go pour être en dehors de la plage de 32 bits? – Joel

Répondre

2

Quelques réflexions:

  • espace Adresse = taille de la mémoire physique.
  • Un i3 prend en charge les espaces d'adressage virtuel en mode 64 bits ou 32 bits avec PAE 36 bits (facultatif, avec prise en charge du noyau). Si vous avez réellement 4GiB de RAM disponible dans le système 32 bits démarré, PAE doit être activé. Vérification: https://serverfault.com/q/247080
  • AFAIR, ces plages peuvent se chevaucher et apparaître dans n'importe quel ordre, de sorte que l'ordre et le recodage du type ou de la répartition de plage le plus restreint sont requis. La dernière adresse de base 0x0000000100000000 est> = 2^32. Ceci est généralement fait, car le matériel, les images ROM et d'autres plages spéciales sont alloués en dessous de 2^32 dans (tous?) PC. Ainsi, le mode PAE ou long est requis pour accéder aux plages de mémoire principales à partir de ou au-dessus de 2^32.

Edit:

Regardez ici pour plus de détails: http://wiki.osdev.org/Detecting_Memory_%28x86%29

Edit 2:

Aujourd'hui, je suis tombé sur un outil Sysinternals qui suit montre la cartographie de plage physique pour mon système EFI, sans aucun paramètre lié modifié. Comme on peut le voir, tous la mémoire principale 64GiB est mis en correspondance à 0x100000000, droit à 2^32:

Sysinternals RamMap on Win 7/ASUS EFI BIOS

+0

Je n'ai pas activé PAE; J'ai besoin d'utiliser des adresses 64 bits pour atteindre cette dernière partie de la mémoire. Donc, les plages inférieures qui sont mappées ailleurs provoquent le besoin d'adresses au-dessus de 4GiB? – Joel

+0

Exactement, les plages de type 0x2,0x3,0x4 en sont la cause. La configuration exacte du mappage dépend du microprogramme du système. Habituellement, il y a aussi des «trous de mémoire», qui expliquent pourquoi plus de mémoire que prévu est mappée au-dessus de 4G. – Sam

+0

Ouais je me demandais à ce sujet, car il y a près de 900MiB mappés au-dessus de 4GiB. Peut-il vraiment en tenir compte? – Joel

Questions connexes