Recentemente, notei que o Windows emitia bipes longos, o que supostamente é um problema de memória 1a no código de erro BSOD. Executei o memtest e encontrei endereços defeituosos mostrados abaixo.
2024-01-24 14:20:11 - [Data Error] Test: 13, CPU: 0, Address: 293B98920, Expected: 5F0DF0A5, Actual: 5F8DF0A5
2024-01-24 14:18:53 - [Data Error] Test: 13, CPU: 0, Address: 293B98920, Expected: D70BA8A2, Actual: D78BA8A2
2024-01-24 14:17:20 - [Data Error] Test: 13, CPU: 0, Address: 293B98920, Expected: 1F1F39AC, Actual: 1F9F39AC
2024-01-24 14:17:05 - [Data Error] Test: 13, CPU: 0, Address: 293B98920, Expected: 50039BF9, Actual: 50839BF9
Eu tenho ~ 12 GB de RAM, então os endereços vão até 31F000000, que é 12784 MB, mas também mostra outros 4 bytes, que são as informações armazenadas nesses endereços, como isso funciona? Existem 13.404.995.584 endereços e cada um deles armazena 4 bytes?
Embora a memória seja endereçada a bytes, é típico que programas (e até mesmo CPUs) a manipulem em 16 bits (2 bytes), 32 bits (4 bytes) ou mesmo 64 bits (8 bytes). unidades. Por exemplo, um programa pode armazenar um valor de 32 bits entre bytes
0xABC0...0xABC3
e diz-se que o valor é armazenado "em 0xABC0" (o resto do intervalo está implícito). Isso é o que o memtest está fazendo aqui.(Mesmo no nível do código de máquina, existem instruções para carregar, por exemplo, um número inteiro de 32 bits da memória como uma única instrução com apenas o endereço 'inicial' especificado, que geralmente é mais rápido que quatro bytes de um byte por vez. instruções de tempo.)
As leituras e gravações na memória não acontecem "por byte", elas estão alinhadas nos "limites das palavras".
Isso significa que se sua memória opera em transferências de 32 bits, para ler o terceiro byte acima
0x000F0000
(então0x000F0002
), você deve trabalhar até o limite de 32 bits mais próximo0x000F0000
e depois transferir todos os quatro bytes para ler o terceiro. Para memória de 64 bits, usada pela maioria dos sistemas modernos, você deve transferir uma "palavra" completa de 8 bytes (64 bits) da memória para ler um único byte dentro dessa área de memória.O Memtest acabou de escolher uma visualização padrão que mostra 4 bytes por vez em vez de 8 ou qualquer que seja o tamanho da transferência de memória do sistema.
O que o software mostra é muitas vezes uma escolha arbitrária baseada no que as pessoas estão mais acostumadas e é uma escolha entre ser sucinto e muito detalhado. Dois blocos
293B98920 51F22EAB
são mais fáceis para uma pessoa analisar do que293B9892051f22eab
Na verdade, você não pode passar
0x000F0002
para um chip de memória física. As linhas de endereço mais baixas que permitem o endereçamento de bytes ficam efetivamente escondidas pelo fato de que a memória moderna usa um barramento de dados paralelo através de um banco de chips de memória. Ao usar 8 chips (ou 4 chips, cada um com dois bancos de memória), você essencialmente não "vê" mais os 3 bits mais baixos de qualquer endereço.Todos esses 8 chips receberão o mesmo endereço e então o que será enviado ao controlador de memória será uma longa palavra de 64 bits que representa o conteúdo de cada chip de memória alinhados juntos.
Essa palavra de 64 bits é então colocada em um registro no processador.
Seu processador, então, vendo que você solicitou o byte específico,
0x000F0002
percorre os 8 bytes recebidos e fornece o terceiro byte. Esses outros bytes foram recebidos no controlador de memória do processador e provavelmente chegaram aos vários caches da CPU, você simplesmente não se preocupou em ler o conteúdo do seu software.