Estoy ejecutando Debian Squeeze (x64):
# uname -srvmo
Linux 2.6.32-5-amd64 #1 SMP Mon Jan 16 16:22:28 UTC 2012 x86_64 GNU/Linux
Tengo 2 unidades compatibles de 2 GB de DDR2 en mi placa base G31M-S . Admite hasta 8 GB:
Como este es un servidor, realmente no me importan los gráficos. Así que lo puse al más bajo.
Internal Graphics Mode Select: Auto
Enabled, 1MB <--
Enabled, 8MB
DVMT Mode Select: Fixed Mode <--
Auto
DVMT/FIXED Memory: 128MB <--
256MB
Sin embargo, Linux solo detecta 3.19GiB de memoria:
# cat /proc/meminfo
MemTotal: 3350712 kB
...
Mirando el mapa E820 :
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
[ 0.000000] BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
[ 0.000000] BIOS-e820: 00000000000e6000 - 0000000000100000 (reserved)
[ 0.000000] BIOS-e820: 0000000000100000 - 00000000cfdb0000 (usable)
[ 0.000000] BIOS-e820: 00000000cfdb0000 - 00000000cfdc0000 (ACPI data)
[ 0.000000] BIOS-e820: 00000000cfdc0000 - 00000000cfdf0000 (ACPI NVS)
[ 0.000000] BIOS-e820: 00000000cfdf0000 - 00000000cfe00000 (reserved)
[ 0.000000] BIOS-e820: 00000000fed00000 - 00000000fed00400 (reserved)
[ 0.000000] BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
[ 0.000000] BIOS-e820: 00000000ff380000 - 0000000100000000 (reserved)
[ 0.000000] DMI present.
[ 0.000000] AMI BIOS detected: BIOS may corrupt low RAM, working around it.
[ 0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)
Y haciendo un poco de matemática:
>>> ((0x9F800 - 0x10000) + (0xCF6B0000 - 0x100000)) / 1024.0 / 1024.0 / 1024.0
3.240476608276367
Obtenemos casi la misma respuesta.
¿Qué me estoy perdiendo?
No estoy comprando completamente el argumento del "espacio de direcciones PCI". Al sacar uno de los dos sobres de 2GB, la pantalla de configuración muestra 2048MB.
# cat /proc/meminfo
MemTotal: 2058432 kB
Eso es 1.96GB.
E820 mapa de nuevo:
[ 0.000000] BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
[ 0.000000] BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
[ 0.000000] BIOS-e820: 00000000000e6000 - 0000000000100000 (reserved)
[ 0.000000] BIOS-e820: 0000000000100000 - 000000007fdb0000 (usable)
[ 0.000000] BIOS-e820: 000000007fdb0000 - 000000007fdc0000 (ACPI data)
[ 0.000000] BIOS-e820: 000000007fdc0000 - 000000007fdf0000 (ACPI NVS)
[ 0.000000] BIOS-e820: 000000007fdf0000 - 000000007fe00000 (reserved)
[ 0.000000] BIOS-e820: 00000000fed00000 - 00000000fed00400 (reserved)
[ 0.000000] BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
[ 0.000000] BIOS-e820: 00000000ff380000 - 0000000100000000 (reserved)
[ 0.000000] DMI present.
[ 0.000000] AMI BIOS detected: BIOS may corrupt low RAM, working around it.
[ 0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)
Y las matemáticas ...
>>> ((0x9F800 - 0x10000) + (0x7fdb0000 - 0x100000)) / 1024.0 / 1024.0 / 1024.0
1.9973125457763672
Entonces obtuve 2GB / 2GB. /proc/cpuinfo
muestra que mi procesador admite direccionamiento físico de 36 bits. 2 ^ 36 = 64 GB, que ni siquiera estoy cerca.
# ./smem -R 4G -w
Area Used Cache Noncache
firmware/hardware 843592 0 843592
kernel image 0 0 0
kernel dynamic memory 181116 134616 46500
userspace memory 287784 19736 268048
free memory 2881812 2881812 0
fuente
Respuestas:
Que necesita para convertir la memoria de reasignación EN en el BIOS. De lo contrario, no reasignará la memoria por encima del límite de 4 GB y parte de la memoria estará cubierta por asignaciones de hardware.
fuente
Memory Hole Remapping
(AMIBIOS), la POST informaría aproximadamente 3.3 GiB, mientras que DMI aún enumeraría dos módulos de 2 GiB cada uno.PCI también usa parte del espacio de direcciones. Tanto las tarjetas PCI como los dispositivos PCI se integran en la placa base (como el conjunto de chips).
Por lo general, esto significaba que de 4GB solo había disponibles de 3¼ a 3½ GB, incluso si no usaba una GPU moderna con mucha RAM incorporada.
fuente
0x100000000 == 1<<32
es interesante. Entonces, ¿por qué el BIOS no asigna el resto de la RAM por encima de 1 << 32? Es un Celeron E3400, y/proc/cpuinfo
diceaddress sizes : 36 bits physical, 48 bits virtual
que debería ser bueno para 64 GB. ((1<<36) / (1024*1024*1024) == 64
)1<<32
o este núcleo no sabe cómo entenderlo.smem
instalado, intentesmem -R 4G -w
obtener una descripción general de la memoria disponible / usada.El firmware utiliza la RAM que falta:
Resumiendo:
Como ve, suma hasta 4GB. Y aquí están los ~ 800M que informa que faltan:
fuente
0x100000000 (1<<32)
? Se comporta como si fuera un sistema de 32 bits.smem -R 2G -w
dice con solo 2G en la máquina (especialmente en lo que respecta al firmware / hardware, ya que esa parece ser la sección donde el "800M faltante" fue con 4G)? Sería bastante divertido si el firmware de repente ya no necesita esos 800M ...AMI BIOS detected: BIOS may corrupt low RAM, working around it.
- y la observación de Wikipedia (desde su enlace e820) "A veces el BIOS tiene errores e informa incorrectamente la memoria reservada. Esto puede hacer que el software de prueba de memoria, como Memtest, informe errores". ? EDITAR: Ah, no, eso solo representaría 64k , no 800M ...