Executando o Windows com RAM com defeito

25

É possível executar o Windows (7, x64) com um módulo de RAM com defeito? Mais precisamente, existe uma maneira de dizer ao Windows para não alocar um endereço incorreto conhecido ou bloco de endereços?

Para Linux, existe o BadRAM . Existe uma implementação existente para o Windows? Isso é possível com o kernel do Windows (NT 6.1)? Talvez um driver no modo kernel?

Prumo
fonte
4
@ekaj Se foi apenas uma semana após a compra, talvez a substitua pela garantia? ;) #
313 Bob
3
Isso é realmente a idéia mais inteligente, Sua quebrado, ficar em corrigi-lo
Journeyman Geek

Respostas:

15

Bob, há três partes em sua pergunta. Vou abordar um de cada vez.

Executando o Windows com memória ruim

É realmente possível executar o Windows 7 com um módulo defeituoso. Dependendo da localização dos setores defeituosos e de onde o módulo fica nos bancos DIMM, o Windows 7 funcionará como se não houvesse nada, desde que não tentasse tocar as partes ruins da memória. Então, idealmente, você moveria o módulo defeituoso o mais longe possível do banco 0. Naturalmente, se esse for o seu único módulo, você estará sem sorte.

Bloqueando setores com memória ruim no Windows

Nos sistemas operacionais x86 (32 e 64 bits), a memória é gerenciada pelo kernel. Como você mencionou, o BadMem é ​​capaz de bloquear setores de memória ruim no Linux. Ele funciona instruindo o kernel a bloquear os endereços de memória que você especificou. Isso efetivamente impede o Linux de endereçar esses endereços ao alocar (e desalocar) memória. Mas, para fazer isso, o BadMem precisa corrigir o kernel. O BadMem nada mais é do que um patch do kernel que você configura antes de aplicar.

Agora, você não tem essa capacidade no Windows. Você não pode corrigir o kernel. O desenvolvimento de um driver no modo kernel também não será bom, pois o kernel do Windows nunca permitirá que seu driver tenha precedência sobre sua arquitetura de gerenciamento de memória (é compreensível).

Por esse motivo, você não pode instruir o Windows de forma alguma a não usar determinados endereços de memória. A única maneira seria a Microsoft corrigir o kernel especificamente para o seu caso. Improvável.

A disseminação de endereços de memória ruim

Não há muitos motivos pelos quais um módulo de memória pode conter endereços incorretos. Por fim, tudo se resume a um erro na linha de produção, supondo que não tenha sofrido danos antes de entrar no seu computador. Ao contrário dos discos rígidos, não há partes móveis nos módulos de memória, como você bem sabe. Portanto, setores ruins não tendem a se espalhar, como é o caso dos setores de disco rígido.

No entanto, o software de teste de memória não é infalível. É possível (e comum) transmitir certos endereços que são de fato ruins. Portanto, a memória ruim pode dar a impressão de "espalhar", à medida que mais e mais endereços são revelados ruins. Por esse motivo, ferramentas como o BadMem revelam suas fraquezas, porque naturalmente elas só podem lidar com os endereços que você instrui.

É improvável que alguém possa realizar um teste completo de um módulo de memória e identificar todos os endereços de memória defeituosos, bloqueá-los e acabar com um módulo de memória "bom". A coisa mais fácil a fazer é considerar um módulo com endereços incorretos como um módulo defeituoso e, consequentemente, não ser confiável.

O que isso significa é que, por mais que o BadMem seja uma proposta atraente, na verdade não é uma solução para o problema da memória ruim. O mais provável é que você ainda não acabe com um sistema operacional que tenta ler um setor defeituoso e trava com um erro de parada. Um módulo ruim é um módulo ruim é um módulo ruim.

Um anão
fonte
Existem algumas boas respostas, mas aceito isso por fornecer uma boa razão para não fazê-lo. Pode-se dizer ao kernel do Windows para não usar além de um determinado endereço, como outros observaram, mas quando o erro está no meio do espaço de endereço, é como usar um machado quando você deseja uma escapada ... um controle mais fino é desejado, mas, aparentemente, impossível. É uma pena.
6603 Bob
8
Não é bem correto; isso é possível instruir o Windows para evitar determinados endereços (mais precisamente, certos números de página quadro). A funcionalidade foi projetada para memória ECC, com a qual o Windows pode detectar possíveis falhas e marcar esses PFNs como ruins, mas é possível adicionar PFNs manualmente à lista: superuser.com/a/490522/117590 - apenas não muito prático. Portanto, sim, a substituição continua sendo a melhor opção: P
Bob
17

O BCD do Windows (dados de configuração de inicialização) realmente tem um {badmemory}objeto. Parece que os endereços de memória "previstos para falhar" pela memória ECC serão listados aqui e não usados ​​pelo sistema operacional.

O {badmemory}objeto aceita um elemento BadMemoryList(tipo BCD 0x1700000a), que é uma lista de números inteiros que podem ser inseridos como hexadecimais, separados por espaços. Eu acho que seria possível inserir manualmente endereços de memória ruim, conforme encontrado pelo memtest86 nesse elemento - mas eu não testei isso. Aparentemente, ele aceita os números de quadro da página, que é o endereço real dividido por 4096. Infelizmente, esses endereços / PFNs podem não corresponder aos relatados pelo diagnóstico de memória. A edição manual pode ser feita com o Visual BCD Editor .

De qualquer forma, os cartões de memória com defeito devem ser substituídos conforme indicado pelas outras respostas. Esta é apenas uma observação sobre uma possível maneira de solucionar o problema (temporariamente?).

Prumo
fonte
Um tutorial melhor formatado de tudo o que você disse está disponível aqui . Bom trabalho, apesar de tudo.
mirh
13

O Windows BCD possui {badmemorylist}e {badmemoryaccess}objetos. Você deve definir a primeira para páginas com memória ruim separadas por espaços (por exemplo bcdedit /set badmemorylist 1499543 1434007) e a segunda para No( bcdedit /set badmemoryaccess No)

Lembre-se de que o tamanho da página de memória no Windows geralmente 4KB

Testado no Windows 7 e funciona bem

Você pode testar suas configurações pelo Rammap by Sysinternals

PS eu tenho essa informação de "Windows Internals Book" chapter 10

Vyacheslav Dorzhiev
fonte
13

Eu tive problemas de RAM em um tablet com SoC. A memória é soldada ou integrada ao SoC e não pode ser substituída.

Estou na Argentina e o vendedor está na China, e os custos de envio e o tempo não fazem sentido enviar garantia.

Consegui alguns hits.

A chave para passar os parâmetros de memória danificados são:

  1. endereços no memtest86 correspondem aos endereços usados ​​no Windows.
  2. deve marcar páginas inteiras de 4KBytes.
  3. no memtest 0x10000000corresponde a 0x10000 no Windows
  4. no memtest 0x00001000corresponde a 0x1 no Windows
  5. significa: O número da página no Windows remove os três últimos números hexadecimais do memtest.
  6. significa que: o Windows elimina zeros à esquerda.
  7. considere 5 e 6, para evitar erros nos números de página.
  8. a instrução correta é: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBApara erros no memtest de 0x000B7000 a 0x000BAFFF. Observe que você não pode colocar uma série de memórias, mas todas as páginas uma a uma
  9. Não é possível adicionar páginas, todas as páginas devem ser marcadas no mesmo comando. Se uma nova página, adiciona substituições mais antigas. Consegui adicionar 4096 páginas em um único comando. Eu não tentei mais.
  10. bcdedit /enum {badmemory}, mostra a lista de páginas marcadas.
  11. bcdedit /set badmemoryaccess no impedir que as páginas marcadas sejam usadas
  12. é necessário reiniciar após marcar as páginas e remover o acesso.
jgustavo
fonte
1
Eu tinha que remover o espaço em branco entre o /eo comando para que ele funcione, por isso, em vez de bcdedit / enum {badmemory}que será bcdedit /enum {badmemory}igual para os outros
flagg19
Funciona, mas infelizmente o limite de cmd no Windows é limitado a 8191 e não pude bloquear todas as páginas com memória ruim. Não foi possível encontrar uma boa solução alternativa para resolver isso. Existe uma maneira de gravar o intervalo de páginas? Eu deveria bloquear todas as páginas de 0x714bc8 a 0x71cbd0, que são páginas demais! O que eu fiz, então? Fiz o teste mais simples (# 0 e # 1) e ele obteve um intervalo de erro de memória mais limitado. Está funcionando bem até agora, não há mais telas azuis. Mas sei que não bloqueei tudo o que seria necessário.
Felipe
3

Tanto quanto sei, a única maneira de fazer isso é usar o comando BurnMem, que pode limitar artificialmente a quantidade de RAM que o Windows usa.

Oliver G
fonte
2
Hmm ... essa é uma opção interessante. Talvez maxmem, uma vez que aparentemente burnmemnão limite o endereço físico máximo enquanto o maxmemfaz. O Vista e 7 equivalentes seria truncatememory. Embora essa seja uma solução possível, existe um método mais preciso para os casos em que a memória defeituosa está no meio ou no início do espaço de endereço e bloqueando tudo depois que não é desejada?
Bob
@ Bob - A razão pela qual você não pode simplesmente substituir o modual de memória ruim é por quê?
Ramhound
@ Ramhound eu poderia, se eu quisesse. Mas isso levaria tempo. No momento, estou executando com metade da minha memória original, o que não é ótimo para minhas VMs. Obter um módulo novo ou de substituição que realmente funcione pode demorar algumas semanas. Se uma solução de software me permite fazer isso em duas horas ou menos, considero o tempo bem gasto e algo novo aprendido. Eu aceitaria essa resposta (minha memória falhou no final do espaço de endereço), mas se alguém tiver uma solução mais versátil, eu preferiria isso para futuras referências.
Bob
@ Bob - Tendo acabado de ler isso bastante extensivamente, parece que não é possível. Isso ocorre porque o BadRam utiliza o memtest para instruir o kernel a excluir endereços incorretos do gerenciador de inicialização, o Windows não pode fazer isso, pois atualmente não há como descobrir quais endereços incorretos devem ser excluídos da mesma maneira que um kernel corrigido pelo BadRam pode .
Oliver G
3

Veja este utilitário: https://github.com/prsyahmi/BadMemory

É muito fácil de usar e suporta o bloqueio de intervalos de endereços. E você pode usar o endereço completo recebido do MemTest86 sem remover os últimos três dígitos.

osipxd
fonte
2

CUIDADO!!! O Windows pode falhar ao inicializar, esteja pronto para reconstruir o BCD. Nesse caso, use o prompt de comando em Opções avançadas de inicialização. Eu não sei por que ele não inicializa mais, parece acontecer aleatoriamente ou se você colocar muitos endereços no badmemorylist.

bootrec /rebuild bcd
bcdedit /export c:\bcdbackup
attrib c:\boot\bcd -h -r -s
ren c:\boot\bcd bcd.old
bootrec /rebuild bcd

Heres um programa de prompt de comando C ++ que obtém uma lista de endereços de memória contínua em um arquivo .txt pronto para ( bcdedit /set badmemorylistou bcdedit /set {badmemory} badmemorylistnão funcionou no Win7 para mim)

Use bcdedit /set badmemoryaccess 0para negar acesso.

Você pode verificar com o EasyBCD em View Settings -> Detalhado. Após uma reinicialização, verifique com o Rammap se o Espaço de Endereço Físico desapareceu.

#include <cstdlib>
#include <iostream>
#include <fstream>

//converts hex into base10
unsigned long convertHexToIntBase10(char* inputHex)
{
    unsigned long hexValue = std::strtoul(inputHex, 0, 16);
    return hexValue;
}

int main(int argc, char* argv[])
{
    if(argc < 3){
        std::cerr << "Usage: MemoryPageListHex [Low Memory Adress] [High Memory Adress] in 4k Pages i.e. MemoryPageListHex 1bae50 1bb0e7 for 0x1bae50148 to 0x1bb0e7fe8" << std::endl;
        return 0;
    }
    auto lowAdr = convertHexToIntBase10(argv[1]);
    auto highAdr = convertHexToIntBase10(argv[2]);
    std::ofstream myfile;
    myfile.open ("MemoryAdress4k.txt");
    for (auto i=lowAdr; i<highAdr; i++){
        myfile << std::hex << "0x" << i << " ";
    }
    myfile.close();
    return 0;
}
Birnd
fonte
1

Sim. Existem parâmetros de inicialização para controlar a quantidade de memória que o Windows pode usar. Você pode remover apenas do final do espaço da memória. Consulte este artigo do msdn para controlar os parâmetros de inicialização. Os parâmetros de interesse são truncatememorye removememory.

Nick Whaley
fonte
Truncar e remover memória parece apenas cortar o acesso à RAM (iniciando de um determinado thresold ou trabalhando de trás para frente). Esta pergunta foi mais sobre o fornecimento de intervalos.
mirh
0

Você pode experimentar esse recurso no Windows 7, mas não tenho certeza de qual chip ele afetará ou se ele desvia a mesma quantidade de cada um. Vou ter que olhar em volta para descobrir isso.

cutrightjm
fonte