O memtest86 + testa a memória usada para executar-se?

65

Um dos cenários comuns de falha do servidor é a DRAM ruim, às vezes até quando a memória ECC é usada.

memtest86+é uma das ferramentas mais úteis para diagnosticar problemas de DRAM. Como ele se carrega no início da memória, eu me pergunto se memtest86+verifica a parte da memória que memtest86+está carregada.

A memória é alocada para memtest86+tão pequena que não importa, ou é possível que ocorra memtest86+um defeito na DRAM porque ela não pode testar os locais de memória em que reside?

Robin
fonte
8
Embora essa questão seja relevante para um servidor, também é relevante para um PC comum, então votei em mudar essa questão para Superusuário, onde ela pode alcançar mais pessoas.
Cristian Ciupitu 21/01

Respostas:

78

Obviamente, o memtest86 + não pode testar a região da memória que atualmente contém o código executável do memtest86 + (mas se houver erros de memória nessa região, é muito provável que o teste em si seja travado). No entanto, o memtest86 + é capaz de realocar seu próprio código para um endereço diferente em tempo de execução e, usando esse truque, é possível testar toda a memória que é permitida pelo firmware (BIOS) - mas não de uma só vez.

Essa realocação de código é descrita em README.background dentro do arquivo de código-fonte do memtest86 + (o arquivo está um pouco desatualizado - por exemplo, ele afirma que os endereços usados ​​para o código do memtest86 + são 0x2000 e 0x200000, mas o endereço baixo, conforme definido na origem, é na verdade, 0x10000, e o endereço alto é 0x2000000 ou 0x300000, dependendo da quantidade de memória na máquina).

Mas mesmo com esse truque de realocação, o memtest86 + não pode testar toda a memória pelos seguintes motivos:

  • Normalmente, o firmware (BIOS) reserva algumas regiões de RAM para seu próprio uso (por exemplo, tabelas ACPI). Embora essas regiões de RAM possam ser acessadas pela CPU, escrever qualquer coisa nelas pode resultar em comportamento imprevisível.

  • Alguma parte da RAM é usada para o Modo de Gerenciamento do Sistema e nem é acessível a partir da CPU fora do código SMM privilegiado.

  • O intervalo de endereços de RAM entre 640K e 1M é inacessível devido a peculiaridades do layout de memória do PC herdado (parte dessa RAM pode ser usada como sombra para a ROM do BIOS e para o SMM, outras partes podem ser completamente inacessíveis).

Sergey Vlasov
fonte
11
Interessante, eu perdi a capacidade de realocação. Obviamente, o SMM e similares estão fora de alcance (além do suporte específico da BIOS).
precisa saber é o seguinte
Essas regiões mapeadas geralmente excluem a DRAM porque algo mais "fora do módulo" está sendo abordado? ROM e dispositivos periféricos dizem.
Mckenzm
3
se você tiver vários módulos de RAM, executar um segundo teste depois de ter trocado eles ...
JFL
É possível que a memória falhe da maneira correta para que o memtest relate incorretamente o sucesso devido à reescrita de suas instruções? Ou melhor, quantas falhas são necessárias?
John Dvorak
3
@ JanDvorak: Em teoria, é possível, é claro. Na prática, eu diria que é apenas um pouco mais provável do que bater com a cabeça no teclado e digitar aleatoriamente um soneto shakespeariano.
Ilmari Karonen
5

Não, o memtest não pode testar sua própria memória. No entanto, é tão pequeno (apenas alguns KB) que dificilmente importa. EDIT: esta afirmação está errada, pois, como indicado na resposta selecionada, o memtest pode se realocar dinamicamente para testar toda a memória endereçável do usuário.

-

Em teoria, o processador moderno pode, no momento da inicialização, configurar parte de seu cache como memória programável, a partir de programas muito pequenos (como memtest) podem ser executados sem tocar na DRAM.

No entanto, é um recurso específico do modelo (que requer suporte do BIOS) e não acho que o memtest esteja usando-o.

shodanshok
fonte
Obrigado pela sua resposta. memtestestá testando o cache da CPU também. Portanto, se memtestele fosse carregado nesse cache, essa parte do cache não poderia ser testada, o que é mais problemático, porque é muito menor que a memória?
Robin
2
Apesar da documentação do memtest86, ele não testa o cache do processador, pelo menos de maneira direta. Além disso, os processadores modernos têm instruções separadas e cache de dados (I $ e D $). Código executável é carregado no cache de instruções e não podem ser diretamente modificados / substituídos
shodanshok
11
O memtest86 + testa definitivamente o cache de dados da CPU, mas isso não importa para esta pergunta. Obrigado novamente por sua resposta.
Robin
3
Você tem certeza disso? Eu pensei que ele havia se copiado em outro lugar enquanto testava a memória em que ele normalmente vive. É por isso que todo teste tem uma parte lenta (a maior parte da memória) e uma parte muito rápida (a pequena parte em que seu código / dados é armazenado).
Peter Cordes
11
@DmitryGrigoryev: Ah ok .. então eu aprendi algo mais :-) Legal, obrigado!
Robin