是否可以找到DIMM的物理地址范围?


17

我注意到SMBios Type 20在这里会有所帮助,但是从版本2.5(2006-09-05)pp.25,L796和pp.131起,它是可选的,而类型16、17和19是强制性的,但不完全是救命。

物理内存阵列(类型16)

整个系统都有这些结构中的一种,解释了该板上可能出现的情况。

Handle 0x1000, DMI type 16, 23 bytes
Physical Memory Array
    Location: System Board Or Motherboard
    Use: System Memory
    Error Correction Type: Multi-bit ECC
    Maximum Capacity: 768 GB
    Error Information Handle: Not Provided
    Number Of Devices: 24

存储设备(类型17)

每个Dimm有一个记录,告诉您板上安装的物理Dimm。

Handle 0x1100, DMI type 17, 34 bytes
Memory Device
    Array Handle: 0x1000
    Error Information Handle: Not Provided
    Total Width: 72 bits
    Data Width: 64 bits
    Size: 2048 MB
    Form Factor: DIMM
    Set: 1
    Locator: DIMM_A1 
    Bank Locator: Not Specified
    Type: DDR3
    Type Detail: Synchronous Registered (Buffered)
    Speed: 1600 MHz
    Manufacturer: XXXX
    Serial Number: XXXX
    Asset Tag: XXXX
    Part Number: XXXX 
    Rank: 1
    Configured Clock Speed: 1333 MHz

内存阵列映射地址(类型19)

这些记录可以有多个,并且每个记录都列出了一系列物理地址。

这是带有两个2GB记忆棒的输出:

Handle 0x1300, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000CFFFFFFF
    Range Size: 3328 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

Handle 0x1301, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x0012FFFFFFF
    Range Size: 768 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

这是四根棍子的输出;2 * 2GB和2 * 4GB:

Handle 0x1300, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000CFFFFFFF
    Range Size: 3328 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

Handle 0x1301, DMI type 19, 31 bytes
Memory Array Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x0032FFFFFFF
    Range Size: 8960 MB
    Physical Array Handle: 0x1000
    Partition Width: 2

请注意,在上面的第一个示例输出中,有两个2GB DIMM,但是有两个范围为3.3GB和0.7GB。使用4 Dimms时,系统还将把内存阵列映射的地址区域合并为两个块,因为它只是表示与e820映射相同的内容,即有效的内存物理地址范围。

1对许多20类记录与一个17类存储设备完全绑定,这意味着可以知道整个物理范围:

$ sudo dmidecode -t 20
# dmidecode 2.12
SMBIOS 2.6 present.

Handle 0x002F, DMI type 20, 19 bytes
Memory Device Mapped Address
    Starting Address: 0x00000000000
    Ending Address: 0x000FFFFFFFF
    Range Size: 4 GB
    Physical Device Handle: 0x002B
    Memory Array Mapped Address Handle: 0x002E
    Partition Row Position: 1

Handle 0x0030, DMI type 20, 19 bytes
Memory Device Mapped Address
    Starting Address: 0x00100000000
    Ending Address: 0x001FFFFFFFF
    Range Size: 4 GB
    Physical Device Handle: 0x002C
    Memory Array Mapped Address Handle: 0x002E
    Partition Row Position: 1

从地址到DIMM似乎可以用于EDAC-错误检测和纠正,但不能从DIMM到整个范围。

查看mcelog的源代码,它还将20类型用于其解码。


你能进一步解释你的问题吗?我不是真的按照您的要求。更多细节或示例将是一个巨大的优势。2个工具,我将开始瓦特/是dmidecodelshw,但我认为你正在寻找比这些提供更多?
slm

@slm:lshw用途dmidecode为代码库,并dmidecode -t 20提供了希望的信息。但是,如前所述,通过SMBIOS 2.5版,该信息保存结构称为“存储设备映射地址”类型20存储单元位置)的结构是可选的-因此,如果存在另一种检索相同信息的方法,则Q为。– type 17定位符值和物理地址范围之间的链接(由可选Type 20)。
Runium

@Sukminder-谢谢。此信息可能应该被合并到Q中。既然您有把握,您会介意吗?
slm

@Sukminder-我添加了一些示例dmidecode -t 20输出,您能解释一下类型17的定位器值与物理地址(类型20)吗?
slm

我假设您不为三字母的政府机构工作,也不拥有他们的资金水平。而且,如果您在那里,那么您就不会在这里询问。对于现代PC /服务器/ MAC,通常将物理内存范围映射到虚拟范围,然后可能会被操作系统重新映射,您可能无法弄清楚。即使这样,它也可能将其映射到DOS时代的640k +扩展内存中。使用32位操作系统可能会给您与64位OS不同的答案。您的最终目标是什么?
MikeP'8

Answers:


1

当您有多个DIMM时,BIOS可能会将它们配置为某种交错形式。因此,您可能有一个2G DIMM是物理0G-> 4G,字节0-7,跳过8-15。(即低64位)另一个2G DIMM是物理0G-> 4G,字节8-15,跳过0-7。(高64位)。请注意,我认为交错实际上比那个更大,因为我认为如果您有QDR内存,则系统可以执行1个地址,即8个64位数据周期,因此以64字节为单位的交错会更好。

您看到的0.7G和3.3G物理安排与需要保持较低的4G开口以便PCI设备,VGA缓冲区,经典的<1M 8086废话等有关。这是由北桥完成的。因此,您有一个映射,例如:0-> 640K,1M-> 3.3G,0.7G(用于BIOS,PCI等),最高可达4G。然后是ram的4G-> 4.7G。


0

蛮力解决方案似乎是

  1. 记录当前配置的内存范围
  2. 关闭电源,卸下有问题的DIMM及其上方的所有DIMM
  3. 重新启动,查看新配置。

2
不确定是否有帮助...即,如果您有6个2GB DIMM,并删除一对,则您的最大范围可能只会缩小4GB,但这并不能告诉您在以前的情况下它们在哪里,但是我会进行测试这个和更新。
阿伦2014年

“..和它上面所有DIMM”,例如,如果有问题的DIMM是在时隙2,也除去在槽3中的DIMM ... N
K7AAY


-1

如今,一切都是虚拟的。

硬件中有一个称为MMU的东西,已经将OS的地址转换为实际的物理地址。它还可能会在DIMM之间分配负载,并将硬件的其他部分映射到地址空间。在OS级别上所谓的物理地址空间已经是通过TLB转换后的视图了。

/programming/36639607/how-exactly-do-kernel-virtual-addresses-get-translated-to-physical-ram是一个很好的解释。


1
他说他想要物理地址范围。
dirkt

1
英特尔在80286上增加了一个MMU,并且在30年前的i386上已完全可用...对于“当今的一切都是虚拟的”来说,是如此多:)内存几乎总是被虚拟化了。
埃里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.