64 位元 Linux 無法辨識我的 3 到 32 GB 內存

64 位元 Linux 無法辨識我的 3 到 32 GB 內存

我的問題是由記憶體模組故障引起的並且很可能是損壞的核心二進位。


我剛剛用基本上全新的硬體啟動了我的電腦。我之前一直在運行 Debian 6.0 AMD64,並且沒有任何變化(字面意思是;我只是從舊主機板上拔下硬碟並將它們重新連接到新主機板上),但發現了一些奇怪的事情:

  • 我實際安裝了 4 x 8 GB RAM
  • UEFI/BIOS 設定報告 16383 MB RAM
  • Linuxfree -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/20111007 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 個插槽,但如果您填滿最後一個插槽,就會遇到麻煩。這是晶片組問題,無法修復。

相關內容