La carte mémoire montre plus de RAM que physiquement disponible

Je travaille sur un petit kernel x86. J’accède et tente de lire la mappe de mémoire fournie par GRUB dans l’en-tête de démarrage multiple. J’ai un processeur Intel i3 et 4 Go de RAM. Pendant que je cours sur cette machine, je lis la carte mémoire suivante:

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

Lorsque je complète les zones de mémoire disponibles, je reçois …

0x1 (disponible) – 3893,8 Mio

Ce qui semble à peu près correct, laissant les 200 derniers MiB réservés à d’autres appareils. Le seul problème est le total des autres types de mémoire:

0x2, 0x3, 0x4 – 331,5 Mio

Mettre ma quantité totale de RAM à 4225,3 Mio ou un peu plus de 4,1 Gio , ce qui me amène à mes questions:

  1. Pourquoi est-ce que je totalise plus de 4 Go de RAM alors que 4GiB seulement sont installés?

  2. Pourquoi la dernière adresse de base dans la mappe de mémoire est-elle 0x0000000100000000? Avec seulement 4 Go de RAM, 32 bits devraient être la taille maximale d’adresse requirejse pour tout adresser. Est-ce que je comprends mal quelque chose ici?

Quelques idées:

  • Espace d’adressage! = Taille de la mémoire physique.
  • Un i3 prend en charge les espaces d’adressage virtuels en mode 64 bits ou 32 bits avec PAE 36 bits (facultatif, avec prise en charge du kernel). Si vous avez réellement 4 Go de RAM disponibles dans le système 32 bits démarré, PAE doit être activé. Comment vérifier: https://serverfault.com/q/247080
  • AFAIR, ces plages peuvent se chevaucher et apparaître dans n’importe quel ordre. Il est donc nécessaire de commander et de saisir à nouveau le type ou le fractionnement de plage le plus restreint.
  • Cette dernière adresse de base, 0x0000000100000000 est> = 2 ^ 32. Cela est généralement fait, car le matériel, les images ROM et d’autres gammes spéciales sont alloués en dessous de 2 ^ 32 dans (tous?) PC. Ainsi, un mode PAE ou long est requirejs pour accéder aux plages de la mémoire principale commençant à ou supérieur à 2 ^ 32.

Modifier:

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

Edit 2:

Aujourd’hui, je suis tombé sur un outil Sysinternals, qui montre le mappage de plage physique suivant pour mon système EFI, sans aucun paramètre associé modifié. Comme on peut le voir, toute la mémoire principale de 64 Go est mappée à 0x100000000 , à droite à 2 ^ 32:

Sysinternals RamMap sur le BIOS EFI Win 7 / ASUS