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.
dmidecode
elshw
, mas acho que você está procurando mais do que estes fornecem?lshw
usadmidecode
como base de código edmidecode -t 20
fornece 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 entretype 17
o valor do localizador e o intervalo de endereços físicos (conforme opcionalmente fornecido porType 20
).dmidecode -t 20
saída, você pode explicar o valor do localizador do tipo 17 vs. endereço físico, tipo 20?Respostas:
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.
fonte
A solução Brute Force parece ser
fonte
qual sistema operacional você está executando? Se Linux como abount este comando?
o primeiro colomn é o endereço físico;
referências: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Reference_Guide/s2-proc-iomem.html /superuser/480451/what-kind-of -memory-address-are-the-aqueles-mostrados-por-proc-ioports-e-proc-iomem
fonte
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.
fonte