Executando o Windows com RAM defeituosa

21

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

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

    
por Bob 03.05.2012 / 13:49

10 respostas

14

Bob, há três partes para 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 onde o módulo fica em seus bancos DIMM, o Windows 7 será executado como se não houvesse nada, desde que não tente 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 este é seu único módulo, você está sem sorte.

Bloqueio de setores com pouca memória no Windows

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

Agora, você não tem essa capacidade no Windows. Você não pode corrigir o kernel. Desenvolver um driver em modo kernel também não fará bem a você, já que o kernel do Windows nunca deixará seu driver ter precedência sobre sua arquitetura de gerenciamento de memória (compreensivelmente).

Por esse motivo, você não pode instruir janelas de forma alguma para 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 propagação de endereços de memória ruins

Não há muitas razões pelas quais um módulo de memória pode conter endereços incorretos. Em última análise, tudo se resume a um erro na linha de produção, assumindo que não sofreu danos antes de entrar em 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. Assim, os setores defeituosos não tendem a se espalhar, como é o caso dos setores de discos rígidos.

No entanto, o software de teste de memória não é infalível. É possível (e comum) passar certos endereços que são de fato ruins. Tão ruim memória pode dar a impressão de "espalhar" como mais e mais endereços são revelados para ser ruim. Por essa razão, ferramentas como o BadMem revelam sua fraqueza, porque naturalmente elas só podem lidar com esses endereços para os quais você as 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 incorretos, bloqueá-los e acabar com um módulo de memória "bom". O mais fácil é considerar um módulo com endereços incorretos como um módulo defeituoso e, consequentemente, não ser confiável.

O que isto 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. É mais provável que você ainda não acabe com um sistema operacional que tente ler um setor defeituoso e falhe com um erro de parada. Um módulo ruim é um módulo ruim é um módulo ruim.

    
por 05.05.2012 / 22:40
17

O BCD do Windows (Dados de Configuração de Inicialização) na verdade tem um objeto {badmemory} . Parece que os endereços de memória que estão "previstos para falhar" por A memória ECC será listada aqui e não será usada pelo sistema operacional.

O objeto {badmemory} 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 ruins como encontrados por memtest86 para este elemento - mas eu não testei isso. Aparentemente, ele aceita 'números de quadros de página, que é o endereço real dividido por 4096. Infelizmente, esses endereços / PFNs podem não corresponder aos relatados pelos diagnósticos de memória. A edição manual pode ser feita com o Editor Visual do BCD .

Em qualquer caso, os cartões de memória defeituosos devem ser substituídos, conforme indicado pelas outras respostas. Esta é apenas uma nota sobre uma possível maneira de contornar o problema (temporariamente?).

    
por 21.10.2012 / 09:14
12

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

Tenha em mente 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

    
por 22.10.2013 / 10:02
11

Eu tive problemas com 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 tempo, não faz sentido enviar a garantia.

Eu consegui alguns hits.

A chave para passar os parâmetros de memória danificados é:

  1. endereços nos endereços de correspondência do memtest86 usados no Windows.
  2. deve marcar páginas inteiras de 4KBytes.
  3. no memtest 0x10000000 corresponde a 0x10000 no Windows
  4. no memtest 0x00001000 corresponde a 0x1 no Windows
  5. significa: O número da página no Windows remove os últimos 3 números hexadecimais do memtest.
  6. significa que: o windows elimina zeros à esquerda.
  7. considere 5 e 6, para evitar erros nos números das páginas.
  8. a declaração correta é: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA para erros no memtest de 0x000B7000 para 0x000BAFFF. Note que você não pode colocar um intervalo de memórias, mas todas as páginas, uma por uma
  9. não pode adicionar páginas, todas as páginas devem estar marcadas no mesmo comando. Se uma nova página, adiciona substitui mais antigo. 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 impede que as páginas marcadas sejam usadas
  12. é necessário reinicializar após marcar as páginas e remover o acesso.
por 13.08.2015 / 17:18
7
Eh, eu não me sentiria confortável usando a memória que eu sabia que era ruim, mesmo que você pudesse bloquear as partes ruins. Eu compraria um novo bastão para paz de espírito.

    
por 05.05.2012 / 21:34
3

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

    
por 03.05.2012 / 14:03
2

Veja este util: link

É 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 três últimos dígitos.

    
por 23.02.2018 / 13:52
2

CUIDADO !!! O Windows pode não inicializar, estar pronto para reconstruir o BCD. Para esse caso, use o Prompt de Comando em Opções Avançadas de Inicialização. Eu não sei porque ele não vai mais inicializar, parece acontecer aleatoriamente ou se você colocar muitos endereços na lista de máscaras.

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 prompt de comando do C ++ Programm que obtém uma lista de endereços de memória contínua em um arquivo .txt pronto para bcdedit /set badmemorylist ou bcdedit /set {badmemory} badmemorylist (não funcionou no Win7 para mim)

Use bcdedit /set badmemoryaccess 0 para negar acesso.

Você pode verificar com o EasyBCD em Exibir configurações - > 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;
}
    
por 17.10.2016 / 01:09
1

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

    
por 05.05.2012 / 21:42
0

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

    
por 04.05.2012 / 14:24