我的问题是由内存模块故障引起的并且很可能是损坏的内核二进制文件。
我刚刚用基本上全新的硬件启动了我的电脑。我之前一直运行 Debian 6.0 AMD64,没有任何变化(字面意思是;我只是从旧主板上拔下硬盘并将它们重新连接到新主板),但发现了一些奇怪的事情:
- 我实际安装了 4 x 8 GB RAM
- UEFI/BIOS 设置报告 16383 MB RAM
- Linux
free -m
报告 2985 MB RAM
2985 MB 似乎与神奇的 3 GB 标记太接近,不可能纯粹是巧合,但uname -r
会打印2.6.32-5-amd64
;显然是一个 64 位内核,这是我正在使用的系统驱动器上安装的所有内核。新主板是华硕 M5A97 Pro,有四个 DDR3 插槽,据说支持 8 GB 模块。内存模块本身是相同的,四个 Corsair XMS3 PC12800 8 GB,一起购买的。
我没有详细查看 UEFI 设置,但确实浏览过它,没有发现任何需要更改才能启用大量 RAM 的地方。
编辑:进一步确认我确实运行的是 64 位:
# file `which free`
/usr/bin/free: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
#
这是怎么回事?我该怎么办?
编辑2:dmesg、dmidecode 和 meminfo,根据要求。我现在无法物理访问该系统,因此必须等到今晚才能取出一些模块并看看它的作用。 (请注意,dmidecode 报告 3 x 8GB 加上一个空 DIMM 插槽。另请注意来自内核的 MTRR 不匹配消息,导致 13 GB 的损失,这至少与主板本身报告的数据相加。)
# dmidecode --type memory
# dmidecode 2.9
SMBIOS 2.7 present.
Handle 0x0026, DMI type 16, 23 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: Multi-bit ECC
Maximum Capacity: 32 GB
Error Information Handle: Not Provided
Number Of Devices: 4
Handle 0x0028, DMI type 17, 34 bytes
Memory Device
Array Handle: 0x0026
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 8192 MB
Form Factor: DIMM
Set: None
Locator: DIMM0
Bank Locator: BANK0
Type: <OUT OF SPEC>
Type Detail: Synchronous
Speed: 1333 MHz (0.8 ns)
Manufacturer: Manufacturer0
Serial Number: SerNum0
Asset Tag: AssetTagNum0
Part Number: Array1_PartNumber0
Handle 0x002A, DMI type 17, 34 bytes
Memory Device
Array Handle: 0x0026
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 8192 MB
Form Factor: DIMM
Set: None
Locator: DIMM1
Bank Locator: BANK1
Type: <OUT OF SPEC>
Type Detail: Synchronous
Speed: 1333 MHz (0.8 ns)
Manufacturer: Manufacturer1
Serial Number: SerNum1
Asset Tag: AssetTagNum1
Part Number: Array1_PartNumber1
Handle 0x002C, DMI type 17, 34 bytes
Memory Device
Array Handle: 0x0026
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 8192 MB
Form Factor: DIMM
Set: None
Locator: DIMM2
Bank Locator: BANK2
Type: <OUT OF SPEC>
Type Detail: Synchronous
Speed: 1333 MHz (0.8 ns)
Manufacturer: Manufacturer2
Serial Number: SerNum2
Asset Tag: AssetTagNum2
Part Number: Array1_PartNumber2
Handle 0x002E, DMI type 17, 34 bytes
Memory Device
Array Handle: 0x0026
Error Information Handle: Not Provided
Total Width: Unknown
Data Width: 64 bits
Size: No Module Installed
Form Factor: DIMM
Set: None
Locator: DIMM3
Bank Locator: BANK3
Type: Unknown
Type Detail: Synchronous
Speed: Unknown
Manufacturer: Manufacturer3
Serial Number: SerNum3
Asset Tag: AssetTagNum3
Part Number: Array1_PartNumber3
#
======================================================================
# cat /proc/meminfo
MemTotal: 3056820 kB
MemFree: 1470820 kB
Buffers: 390204 kB
Cached: 194660 kB
SwapCached: 0 kB
Active: 488024 kB
Inactive: 419096 kB
Active(anon): 231112 kB
Inactive(anon): 96660 kB
Active(file): 256912 kB
Inactive(file): 322436 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 322320 kB
Mapped: 33012 kB
Shmem: 5472 kB
Slab: 613952 kB
SReclaimable: 597404 kB
SUnreclaim: 16548 kB
KernelStack: 2384 kB
PageTables: 19472 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1528408 kB
Committed_AS: 621464 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 294484 kB
VmallocChunk: 34359429080 kB
HardwareCorrupted: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 9216 kB
DirectMap2M: 2054144 kB
DirectMap1G: 1048576 kB
#
======================================================================
# dmesg | grep -i memory
[ 0.000000] WARNING: BIOS bug: CPU MTRRs don't cover all of memory, losing 13295MB of RAM.
[ 0.000000] WARNING: at /tmp/buildd/linux-2.6-2.6.32/debian/build/source_amd64_none/arch/x86/kernel/cpu/mtrr/cleanup.c:1092 mtrr_trim_uncached_memory+0x2e6/0x311()
[ 0.000000] [<ffffffff814f7f1e>] ? mtrr_trim_uncached_memory+0x2e6/0x311
[ 0.000000] [<ffffffff814f7f1e>] ? mtrr_trim_uncached_memory+0x2e6/0x311
[ 0.000000] [<ffffffff814f7f1e>] ? mtrr_trim_uncached_memory+0x2e6/0x311
[ 0.000000] initial memory mapped : 0 - 20000000
[ 0.000000] init_memory_mapping: 0000000000000000-00000000bdf00000
[ 0.000000] PM: Registered nosave memory: 000000000009d000 - 000000000009e000
[ 0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000000a0000
[ 0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000e0000
[ 0.000000] PM: Registered nosave memory: 00000000000e0000 - 0000000000100000
[ 0.000000] PM: Registered nosave memory: 00000000bd94d000 - 00000000bd99c000
[ 0.000000] PM: Registered nosave memory: 00000000bd99c000 - 00000000bd9a6000
[ 0.000000] PM: Registered nosave memory: 00000000bd9a6000 - 00000000bdade000
[ 0.000000] PM: Registered nosave memory: 00000000bdade000 - 00000000bdaef000
[ 0.000000] PM: Registered nosave memory: 00000000bdaef000 - 00000000bdb02000
[ 0.000000] PM: Registered nosave memory: 00000000bdb02000 - 00000000bdb04000
[ 0.000000] PM: Registered nosave memory: 00000000bdb04000 - 00000000bdb0d000
[ 0.000000] PM: Registered nosave memory: 00000000bdb0d000 - 00000000bdb13000
[ 0.000000] PM: Registered nosave memory: 00000000bdb13000 - 00000000bdb75000
[ 0.000000] PM: Registered nosave memory: 00000000bdb75000 - 00000000bdd78000
[ 0.000000] Memory: 3046732k/3111936k available (3075k kernel code, 4728k absent, 60476k reserved, 1879k data, 584k init)
[ 1.636730] Freeing initrd memory: 9501k freed
[ 1.647370] Freeing unused kernel memory: 584k freed
[ 4.876602] [TTM] Zone kernel: Available graphics memory: 1528410 kiB.
[ 4.876615] [drm] radeon: 256M of VRAM memory ready
[ 4.876617] [drm] radeon: 512M of GTT memory ready.
[ 25.571018] VBoxDrv: dbg - g_abExecMemory=ffffffffa051d6c0
#
对 e820 的 Grepping 显示了一系列范围,顶部为e820 update range: 00000000bdf00000 - 000000043f000000 (usable) ==> (reserved)
. 43f000000 是 16 GiB,bdf00000 是 3039 MiB。我愿意不是看到这是巧合。
# dmesg | grep -i e820
[ 0.000000] BIOS-e820: 0000000000000000 - 000000000009d800 (usable)
[ 0.000000] BIOS-e820: 000000000009d800 - 00000000000a0000 (reserved)
[ 0.000000] BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
[ 0.000000] BIOS-e820: 0000000000100000 - 00000000bd94d000 (usable)
[ 0.000000] BIOS-e820: 00000000bd94d000 - 00000000bd99c000 (ACPI NVS)
[ 0.000000] BIOS-e820: 00000000bd99c000 - 00000000bd9a6000 (ACPI data)
[ 0.000000] BIOS-e820: 00000000bd9a6000 - 00000000bdade000 (reserved)
[ 0.000000] BIOS-e820: 00000000bdade000 - 00000000bdaef000 (ACPI NVS)
[ 0.000000] BIOS-e820: 00000000bdaef000 - 00000000bdb02000 (reserved)
[ 0.000000] BIOS-e820: 00000000bdb02000 - 00000000bdb04000 (ACPI NVS)
[ 0.000000] BIOS-e820: 00000000bdb04000 - 00000000bdb0d000 (reserved)
[ 0.000000] BIOS-e820: 00000000bdb0d000 - 00000000bdb13000 (ACPI NVS)
[ 0.000000] BIOS-e820: 00000000bdb13000 - 00000000bdb75000 (reserved)
[ 0.000000] BIOS-e820: 00000000bdb75000 - 00000000bdd78000 (ACPI NVS)
[ 0.000000] BIOS-e820: 00000000bdd78000 - 00000000bdf00000 (usable)
[ 0.000000] BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved)
[ 0.000000] BIOS-e820: 00000000fec10000 - 00000000fec11000 (reserved)
[ 0.000000] BIOS-e820: 00000000fec20000 - 00000000fec21000 (reserved)
[ 0.000000] BIOS-e820: 00000000fed00000 - 00000000fed01000 (reserved)
[ 0.000000] BIOS-e820: 00000000fed61000 - 00000000fed71000 (reserved)
[ 0.000000] BIOS-e820: 00000000fed80000 - 00000000fed90000 (reserved)
[ 0.000000] BIOS-e820: 00000000fef00000 - 0000000100000000 (reserved)
[ 0.000000] BIOS-e820: 0000000100001000 - 000000043f000000 (usable)
[ 0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)
[ 0.000000] e820 update range: 00000000bdf00000 - 000000043f000000 (usable) ==> (reserved)
[ 0.000000] update e820 for mtrr
#
编辑 3/4 -- 部分成功:
- 将 UEFI BIOS 从 版本升级
0705 x64 08/23/2011
到1007 02/10/2012
没有帮助:完全相同的问题仍然存在。 - 移除一个 DIMM 模块(我幸运地猜测哪个插槽是#4:离 CPU 最远的插槽)允许 BIOS 检测并使用剩余的 24 GB,尽管根据用户手册中的图表。值得注意的是,将剩余 DIMM 之一安装在插槽 #4 中仍然可以使用它,因此该插槽没有问题。将“原始”DIMM 重新插入该插槽后,我又回到了起点。
- 从 Debian 6.0.3 AMD64 安装 CD 启动到救援环境并检查其
dmesg
输出是否显示没有类似的 MTRR 错误。此外,在该环境中,安装 3 x 8GB 后,24 GB(加上或减去 epsilon 乘以 pi 或左右;我没有进行精确的数学计算)根据free
. - 升级/重新安装内核(有一个小的升级可用)似乎也解决了 MTRR 问题。
dmesg
现在报告总计 26198016 KB,并且没有 MTRR 错误,这与我对安装 3 x 8GB 的预期一致。free -m
现在报告总 RAM 为 24114 MB,坦率地说,这对我来说已经足够接近了。
这闻起来就像是一个被吐出来的 DIMM,加上一个无论出于什么原因被损坏的内核;后者可能在停电期间发生了(尽管我必须说这是内核崩溃的奇怪方式!)。当我与经销商交谈后(希望是明天),无法使用的 DIMM 将立即返还给经销商。
(希望)最终编辑
我对两对 DIMM 中的一对进行了 RMA,经销商认为它已损坏,然后他们给我寄了一对新的,看起来工作得很好。所以我现在基本上已经达到了近一个月前我最初打算的水平(尽管这段时间的很大一部分并不是经销商造成的),可用内存为 32 GB;free -m
报告总内存为 32194 MB,内核报告34586624k
初始化时的 RAM,这两者都非常符合我的预期。
答案1
首先,如果您的 BIOS/UEFI 无法正确检测您的 RAM,那么您的操作系统也不会做得更好。如果您的 BIOS 显示有关您的设置的信息不正确,则无需进一步操作。
=> 你可能有至少硬件问题。
编辑:来自您的 dmesg | grep内存,看来你有实际上硬件问题,位于嵌入式 BIOS 中。至少,Linux 已经检测到它并警告您:WARNING: BIOS bug: CPU MTRRs don't cover all of memory, losing 13295MB of RAM
。您的 4 RAM 模块之一似乎未正确识别或插入。
您可以向制造商报告,升级 BIOS 并更换主板。如果 RAM 较少,您很可能不会遇到此错误。
作为旁注,您可能同意这句著名的话Linus Torvalds 谈 BIOS 制造商:
BIOS 编写者通常都是完全无能的瘾君子
其次,当您的 BIOS 与主板上的实际配置相符时,您可以在 Linux 上查看/proc/meminfo
。通常,您的 Linux 系统知道什么以及如何使用您的内存,这一点通常非常清楚。这是我的 64 位/8 GB RAM 上的内容:
$ cat /proc/meminfo
MemTotal: 8175652 kB
MemFree: 5476336 kB
Buffers: 63924 kB
Cached: 1943460 kB
SwapCached: 0 kB
[...]
关于启动过程以及Linux内核使用/释放的内容,您可以从以下位置grep它dmesg
:
$ dmesg | grep Memory
[ 0.000000] Memory: 8157672k/8904704k available (6138k kernel code, 534168k absent, 212864k reserved, 6896k data, 988k init)
编辑:正如 Gilles 所说,通过dmidecode --type memory
,您可以了解有关硬件配置的详细信息。对于 4x2Gb 系统来说,它看起来像这样:
$ sudo dmidecode --type memory
# dmidecode 2.9
SMBIOS 2.6 present.
Handle 0x0020, DMI type 16, 15 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 32 GB
Error Information Handle: Not Provided
Number Of Devices: 4
Handle 0x0022, DMI type 17, 28 bytes
Memory Device
Array Handle: 0x0020
Error Information Handle: Not Provided
Total Width: 64 bits
Data Width: 64 bits
Size: 2048 MB
[...]
[This block is repeated for each module]
答案2
在 /var/log/dmesg 中搜索内存映射(grep for 'e820')并计算那里报告的可用内存数量。这就是 BIOS 告诉已加载操作系统的内存信息。
(这仅适用于旧式引导。我不知道如果使用 EFI 式引导,如何报告内存,但我猜有类似的报告。)
此外,在安装了 32GB 的情况下,BIOS 报告为 16GB,这意味着内存设置有些奇怪。尝试将安装的内存减少到 4 或 8 GB 并比较效果。
答案3
许多较旧的 AMD 主板可能有 4 个插槽,但如果您填满最后一个插槽,就会遇到麻烦。这是芯片组问题,无法修复。