É possível encontrar o intervalo de endereços físicos de um DIMM?

17

Observo que o SMBios Tipo 20 ajudaria aqui, mas é opcional na versão 2.5 (05-09-2006), p. 25, L796 e p. 131 , enquanto os tipos 16, 17 e 19 são obrigatórios, mas não são bem assim. Socorro.

Matriz de memória física (tipo 16)

Existe uma dessas estruturas para todo o sistema, explicando o que é possível neste quadro.

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

Dispositivo de memória (tipo 17)

Há um registro por cada Dimm, que informa os Dimms físicos instalados na placa.

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

Endereço mapeado da matriz de memória (tipo 19)

Pode haver vários desses registros, e cada registro lista um intervalo de endereços físicos.

Aqui está a saída com dois sticks de 2 GB:

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

E aqui está a saída com 4 varas; 2 * 2 GB e 2 * 4 GB:

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

Observe que no primeiro exemplo de saída acima, havia dois DIMMs de 2 GB, mas dois intervalos de 3,3 GB e 0,7 GB. Com 4 Dimms, o sistema também une a região de endereço mapeada da matriz de memória em dois blocos, pois representa apenas o mesmo que o mapa e820, ou seja, os intervalos de endereços físicos de memória válidos.

1 a muitos registros Tipo 20 estão vinculados a exatamente um dispositivo de memória tipo 17, o que significa que todo o intervalo físico pode ser conhecido:

Exemplo

$ 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

Parece possível ir do endereço para o DIMM para fins de EDAC - Detecção e correção de erros , mas não do DIMM para todo o intervalo.

Observando o código fonte do mcelog , ele também está usando o tipo 20 para sua decodificação.

Alun
fonte
Você pode explicar melhor o seu Q? Eu realmente não sigo o que você está perguntando. Mais detalhes ou exemplos seriam uma grande vantagem. 2 ferramentas que eu ia começar w / são dmidecodee lshw, mas acho que você está procurando mais do que estes fornecem?
Slm
@ slm: lshwusa dmidecodecomo base de código e dmidecode -t 20fornece as informações desejadas. Mas, como observado, na versão 2.5 do SMBIOS, a estrutura que contém essas informações "Endereço mapeado para dispositivo de memória", também conhecido como Tipo 20 ou localização do banco, é opcional - portanto, Q é se houver outra maneira de recuperar as mesmas informações. - Link entre type 17o valor do localizador e o intervalo de endereços físicos (conforme opcionalmente fornecido por Type 20).
Runium
@Sukminder - obrigado. Essa informação provavelmente deve apenas ser incorporada ao P. Como você tem um controle sobre isso, você se importaria?
Slm
@Sukminder - eu adicionei um exemplo de dmidecode -t 20saída, você pode explicar o valor do localizador do tipo 17 vs. endereço físico, tipo 20?
Slm
Assumirei que você não trabalha para uma agência governamental de três letras ou tem seu nível de financiamento. E, se você estiver lá, não estará perguntando aqui. Para um PC / servidor / MAC moderno, os intervalos de memória física geralmente são mapeados para intervalos virtuais e, em seguida, podem ser mapeados novamente pelo sistema operacional; talvez você não consiga descobrir. Mesmo assim, ele poderá mapeá-lo na memória estendida de 640k + dos dias do DOS. O uso de um sistema operacional de 32 bits provavelmente fornecerá uma resposta diferente de um sistema operacional de 64 bits. Qual é o seu objetivo final?
Mikep

Respostas:

1

Quando você tem vários DIMMS, o BIOS pode configurá-los em alguma intercalação. Portanto, você pode ter um DIMM 2G sendo físico 0G-> 4G, bytes 0-7, pulando 8-15. (ou seja, 64 bits baixos) O outro DIMM 2G é físico 0G-> 4G, bytes 8-15, pulando 0-7. (alta de 64 bits). Observe que eu acho que a intercalação é realmente maior que isso, porque acho que se você tiver memória QDR, o sistema pode fazer 1 endereço, ciclos de dados de 8x e 64 bits, portanto, a intercalação por unidades de 64 bytes seria melhor.

Os arranjos físicos de 0,7G e 3,3G que você vê têm a ver com a necessidade de manter alguns dos 4G mais baixos abertos para dispositivos PCI, buffers VGA, porcaria clássica <1M 8086 etc. Isso é feito pela ponte norte. Então você tem um mapa como: 0-> 640K, 1M-> 3.3G, 0.7G para BIOS, PCI, etc. até 4G. E então 4G-> 4.7G para ram.

mcr
fonte
0

A solução Brute Force parece ser

  1. registrar o intervalo de memória da configuração atual
  2. desligue, remova o DIMM em questão e todos os DIMMs acima dele
  3. reinicie, revise a nova configuração.
K7AAY
fonte
2
Não tenho certeza se isso ajuda ... ou seja, se você tivesse 6 DIMMs de 2 GB e remover um par, é provável que seu alcance máximo diminua em 4 GB, mas isso não indica onde eles estavam no caso anterior, mas testarei isso e atualização.
Alun
".. e todos os DIMMs acima dele", por exemplo, se o DIMM em questão é no slot 2, também remover o DIMM nos slots 3 ... n
K7AAY
-1

Hoje em dia tudo é virtual.

Há algo chamado MMU no hardware que já traduz endereços para o sistema operacional em endereços físicos reais. Também pode distribuir a carga entre os DIMMs e mapear outras partes do hardware no espaço de endereço. O que é chamado de espaço de endereço físico no nível do sistema operacional já é uma via exibição traduzida do TLB .

/programming/36639607/how-exactly-do-kernel-virtual-addresses-get-translated-to-physical-ram é uma boa explicação.

Thomas
fonte
1
Ele disse que queria o intervalo de endereços físicos .
dirkt
1
A Intel adicionou um MMU ao 80286 e estava totalmente funcional no i386 ... há mais de 30 anos ... tanto para a memória "hoje em dia tudo é virtual" :) a memória sempre foi virtualizada.
Eric