É 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?
windows-7
memory
hardware-failure
Prumo
fonte
fonte
Respostas:
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.
fonte
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 elementoBadMemoryList
(tipo BCD0x1700000a
), 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?).
fonte
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 exemplobcdedit /set badmemorylist 1499543 1434007
) e a segunda paraNo
(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
fonte
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:
0x10000000
corresponde a 0x10000 no Windows0x00001000
corresponde a 0x1 no Windowsbcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA
para 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 umabcdedit /enum {badmemory}
, mostra a lista de páginas marcadas.bcdedit /set badmemoryaccess no
impedir que as páginas marcadas sejam usadasfonte
/
eo comando para que ele funcione, por isso, em vez debcdedit / enum {badmemory}
que serábcdedit /enum {badmemory}
igual para os outrosTanto quanto sei, a única maneira de fazer isso é usar o comando BurnMem, que pode limitar artificialmente a quantidade de RAM que o Windows usa.
fonte
maxmem
, uma vez que aparentementeburnmem
não limite o endereço físico máximo enquanto omaxmem
faz. O Vista e 7 equivalentes seriatruncatememory
. 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?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.
fonte
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.
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 badmemorylist
oubcdedit /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 View Settings -> Detalhado. Após uma reinicialização, verifique com o Rammap se o Espaço de Endereço Físico desapareceu.
fonte
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
truncatememory
eremovememory
.fonte
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.
fonte