Como colocar na lista negra um setor de RAM com defeito, de acordo com a indicação de erro do MemTest86 +?

28

O MemTest86 + (a versão incluída no Ubuntu 13.04) diz

Failing address: 002f796c48 -    759.5 MB

O que devo especificar no memmapparâmetro kernel para ignorar esta área?

Eu tentei correr memtester 770MBe ele diz que está tudo bem, então não parece que as indicações do MemTest significam um erro no 759,5º MB desde o início.

Como interpretar essa indicação do MemTest para configurar memmap?

Agora não tenho dinheiro para comprar nova RAM e o erro parece ser único, então espero poder substituí-lo.

Ivan
fonte
FWIW, o kernel marcará determinadas páginas como "reservadas" se detectar um segmento incorreto, mas conseguir se recuperar. A saída de "free -m" mostra potências de dois para os totais? Menciono isso como uma maneira de explicar por que o memtester não pode ver a RAM ruim, mas o memtest86 + pode.
Bratchley
Não se parece com potências de dois actially: i.stack.imgur.com/l86L1.png
Ivan
No momento em que um erro é detectado (se você tiver um ecc ram), geralmente é tarde demais. Além disso, o free -m nunca reporta uma potência igual a dois, pois a bios e o kernel reservam alguns ram.
Psusi
11
Sonho em comprar um laptop ECC, mas nunca consegui encontrar nenhuma oferta disponível, parece que ela não existe.
Ivan
Parece que o kernel também imprime quando encontra uma página ruim (linha 264-265).
Bratchley

Respostas:

26

memmap

Existe este tutorial intitulado: HowTo Bad Memory, que discute a desativação da memória através do kernel usando o memmapargumento para o kernel. De acordo com o howto, você tem 2 opções quando se trata de memmap:

  • Desligue tudo após a memória ruim - (mem=###M option)
  • Desligue apenas a memória em torno da memória ruim - (memmap=#M$###M option)

Com a primeira opção, se o memtest relatar que há memória ruim em 600M, você poderá desativar a RAM desse ponto até o final da RAM com isso:

 mem=595M

Se houver RAM ruim em 802M e 807M, você pode desativar uma seção de 10M de RAM, começando em 800M, assim:

memmap=10M$800M

NOTA: Isso colocará na lista negra os 10M após o endereço base de 800M. Você deve executar memtest86+posteriormente para confirmar que esse argumento está correto.

BadRAM

Existe um patch disponível para o Ubuntu chamado BadRam. Está bem coberto aqui neste post intitulado: BadRAM no site da comunidade Ubuntu.

Depois de aplicar o patch ao kernel usando os detalhes dessa página, você faz modificações na configuração do Grub2:

trecho desse site para Grub2

O arquivo de configuração do GRUB2 no Natty tem uma linha para configurar exclusões de ram incorreta do kernel. Portanto, assumirei que essa é a maneira preferida de mapear uma seção da memória que está mostrando erros. A linha que estabeleci foi

GRUB_BADRAM = "0x7DDF0000,0xffffc000"

A maneira sugerida em todos os sites que pude encontrar foi definir isso: executar o memtest86 e mostrar as configurações do BadRAM. memtest86 me deu uma página de coisas que eu teria que entrar. Pude ver que todos os endereços estavam em um bloco de 16K, então eu só queria mapear esse bloco de 16K fora de ação. Aqui está como eu gerei a entrada correta.

O primeiro parâmetro é fácil. Esse é o endereço base da memória ruim. No meu caso, pude ver que todos os endereços incorretos eram maiores que 0x7DDF0000 e menores que 0x7DDF4000. Então, tomei o início do bloco 16K como meu endereço inicial.

O segundo parâmetro é uma máscara. Você coloca 1s em que o intervalo de endereços que você deseja compartilha os mesmos valores e 0s em que variará. Isso significa que você precisa escolher seu intervalo de endereços para que apenas os bits de ordem baixa variem. Olhando para o meu endereço, a primeira parte da máscara é fácil. Você quer começar com 0xffff. Para a próxima mordidinha, explicarei com mapas de bits. Eu quero variar de 0000 a 0011. Portanto, a máscara para o badram seria 1100 ou um hex c. Os últimos 3 petiscos devem ter todos os 0s na máscara, pois queremos que todo o intervalo seja mapeado. Portanto, obtemos um resultado total de 0xffffc000.

Depois de definir esta linha em / etc / default / grub, executei o sudo update-grub e reiniciei e minha memória ruim não estava mais sendo usada. Não são necessários patches do kernel para mapear memória ruim usando esse método.

Acompanhamento # 1

Olhando na página da wikipedia o memtest86 +, ele diz o seguinte:

trecho da página da Wikipédia Memtest86

A partir do Memtest86 2.3 e do Memtest86 + 1.60, o programa pode gerar uma lista de regiões com RAM ruim no formato esperado pelo patch BadRAM para o kernel do Linux; Usando essas informações, um sistema Linux pode usar com segurança um módulo de RAM, mesmo que tenha alguns bits ruins. O Grub2 é capaz de fornecer essas mesmas informações a um kernel sem patch, negando a necessidade do patch BadRAM.

Também me deparei com esta página do Gentoo que especificava o memmap=...uso de um endereço hexadecimal, para que você pudesse especificá-lo assim:

memmap=5M$0x2f796c48

O 5M é apenas um palpite, obviamente, você pode ajustá-lo para mais ou para menos, dependendo da quantidade de RAM nessa região que você deseja / precisa omitir.

Finalmente, você também pode especificar o tamanho em hexadecimal:

memmap=0x10000$0x2f796c48

Ignoraria 64KB começando no endereço 0x2f796c48.

Referências

slm
fonte
"800M a 804M" deveria ser "800M a 810M", presumo ...
Hauke ​​Laging
Pode ser, mas o que eu escrevi também está OK, mesmo que esteja desperdiçando mais memória do que os 4M entre 800M e 810M.
slm
11
1. Conheço a memmapopção, mas a questão é mais sobre como interpretar a saída do memtest86 +. Dei um exemplo específico de saída do memtest86 + e peço ajuda para configurar memmap adequadamente nesse caso específico. 2. "Você deve executar o memtest86 + posteriormente para confirmar que este argumento está correto." - O memtest86 + roda antes de um kernel do sistema operacional, então duvido seriamente que a memmapopção do kernel do Linux possa afetá-lo.
Ivan
@ Ivan, 1. Eu pensei que era óbvio, dado os exemplos que incluí, mas você precisaria dizer algo como: memmap=5M$759Mpara o seu caso particular, dado que o memtest86 + está falhando em 759,5MB. 2. Eu quis dizer que você deveria passar a memmap=...opção para o memtest86 + também. Isso não foi testado / não foi confirmado por mim, mas algo que você poderá fazer com o memtest86 +.
Slm
11
Ok obrigado. Eu não sabia ao certo o que significa "002f796c48 - 759,5 MB" (talvez possa ser 759,5 megas após o endereço 002f796c48 ou algo parecido) e nunca suspeitei que possa passar os parâmetros do kernel do Linux para o MemTest86 + (achei que não era nada demais) faça com o Linux).
Ivan
14

O Memtest86 + (usei o 4.20) pode gerar um formato badram diretamente.

  1. Pressione 'c' para acessar o diálogo de configuração diálogo de configuração do memtest

  2. Em seguida, '4' para "Modo de relatório de erros"

    diálogo do modo de relatório de erros do memtest

  3. Então '3' para "Padrões BadRAM"

A saída mudará de uma lista de falhas individuais de teste para uma série de linhas badram =, cada uma contendo mais um novo setor defeituoso. Como as linhas acrescentam e combinam segmentos adjacentes, você pode executar o teste sem cabeça durante a noite e usar a linha final impressa (embora, se você tiver um dimm realmente ruim, o formato menos preciso "5 megas ao redor deste ponto" provavelmente será um pouco mais curto )

Resultado final:

Memtest86 + mostrando saída de badram

skorgu
fonte
4
Agora, se eu não tivesse que copiar isso manualmente e entregá-lo ao GRUB sem redigitar erros, isso seria fantástico.
Ehtesh Choudhury
8
O que fiz foi tirar uma foto (câmera do telefone), carregá-la no GIMP, => escala de cinza => inverter => contraste / gama e depois entregá-la para tesseract ${IMG} stdout.., então verificamos e corrigimos a linha antes de inseri-la em / etc / default / grub ... provavelmente levou entrando apenas enquanto manualmente-lo imediatamente ^^
eMPee584
3
Definitivamente mais divertido do que fazê-lo manualmente embora
ovelhas voando