RAM이 불량한 Windows 실행


25

결함이있는 RAM 모듈로 Windows (7, x64)를 실행할 수 있습니까? 보다 정확하게는 Windows에 알려진 잘못된 주소 나 주소 블록을 할당하지 않도록 지시하는 방법이 있습니까?

Linux의 경우 BadRAM이 있습니다. 기존의 Windows 구현이 있습니까? Windows 커널 (NT 6.1)에서도 가능합니까? 커널 모드 드라이버일까요?


4
@ekaj 구매 후 1 주일이 지난 경우 보증 기간 내에 교체 하시겠습니까? ;)
Bob

3
실제로 가장 현명한 아이디어입니다. 깨졌습니다. 고치십시오
Journeyman Geek

답변:


15

밥, 질문에는 세 부분이 있습니다. 한 번에 하나씩 설명하겠습니다.

메모리가 나쁜 Windows 실행

실제로 결함이있는 모듈로 Windows 7을 실행할 수 있습니다. 불량 섹터의 위치와 모듈이 DIMM 뱅크에있는 위치에 따라 Windows 7은 메모리의 불량 부분을 건드리지 않는 한 아무 것도없는 것처럼 실행됩니다. 따라서 이상적으로 결함이있는 모듈을 뱅크 0에서 가능한 멀리 떨어 뜨려 놓는 것이 이상적입니다. 당연히 이것이 유일한 모듈 인 경우 운이 좋지 않습니다.

Windows에서 불량 메모리 섹터 차단

x86 (32 및 64 비트) 운영 체제에서 메모리는 커널에 의해 관리됩니다. 언급했듯이 BadMem은 Linux에서 불량 메모리 섹터를 차단할 수 있습니다. 커널이 지정한 메모리 주소를 잠그도록 지시함으로써 작동합니다. 이렇게하면 메모리를 할당 (및 할당 해제) 할 때 Linux가 해당 주소를 처리하지 못하게됩니다. 그러나이를 위해 BadMem은 커널을 패치해야합니다. BadMem은 적용하기 전에 구성하는 커널 패치에 지나지 않습니다.

이제 Windows에는 해당 기능이 없습니다. 커널을 패치 할 수 없습니다. Windows 커널은 드라이버가 메모리 관리 아키텍처보다 우선시하지 않기 때문에 커널 모드 드라이버를 개발해도 아무런 효과가 없습니다.

따라서 특정 메모리 주소를 사용하지 않도록 창에 지시 할 수 없습니다. 유일한 방법은 Microsoft가 귀하의 경우에 맞게 커널을 패치하는 것입니다. 있을 것 같지 않게.

잘못된 메모리 주소 확산

메모리 모듈에 잘못된 주소가 포함될 수있는 많은 이유가 없습니다. 궁극적으로 컴퓨터에 들어가기 전에 손상을 입지 않았다고 가정하면 생산 라인의 오류로 귀결됩니다. 하드 드라이브와 달리 메모리 모듈에는 움직일 수있는 부품이 없습니다. 따라서 하드 드라이브 섹터와 마찬가지로 불량 섹터는 확산되지 않습니다.

그러나 메모리 테스트 소프트웨어는 완벽하지 않습니다. 실제로 나쁜 특정 주소를 전달하는 것이 가능하고 일반적입니다. 따라서 더 많은 주소가 나쁘면 메모리가 잘못되면 "확산"이라는 인상을 줄 수 있습니다. 이러한 이유로 BadMem과 같은 도구는 약점을 드러냅니다. 왜냐하면 사용자가 지시 한 주소 만 처리 할 수 ​​있기 때문입니다.

누구나 메모리 모듈에 대한 철저한 테스트를 수행하고 모든 불량 메모리 주소를 식별 한 다음이를 잠그고 "좋은"메모리 모듈로 끝날 가능성은 거의 없습니다. 가장 쉬운 방법은 잘못된 주소를 가진 모듈을 전체적으로 결함이있는 모듈로 간주하여 신뢰할 수없는 것으로 간주하는 것입니다.

이것이 의미하는 바는 BadMem이 매력적인 제안만큼이나 실제로 나쁜 메모리 문제에 대한 해결책이 아니라는 것입니다. 아마도 불량 섹터를 읽으려고 시도하고 중지 오류와 충돌하는 운영 체제로 끝나지 않을 가능성이 큽니다. 불량 모듈은 불량 모듈은 불량 모듈입니다.


이 꽤 좋은 답변입니다,하지만 난 좋은 이유주는 이것을 받아 들일 것입니다 그렇게 할 수 없음. Windows 커널은 다른 사람들이 지적한 것처럼 특정 주소를 지나서 사용하지 말라고 지시 할 수 있지만 오류가 주소 공간의 중간에있을 때 scapel을 원할 때 도끼를 사용하는 것과 같습니다 ... 더 미세한 제어가 바람직하지만, 분명히 불가능하다. 불쌍해.
Bob

8
정확하지 않습니다. 이다 특정 주소 (더 정확하게, 특정 페이지 프레임 번호)를 방지하기 위해 윈도우를 지시 할 수있다. 이 기능은 ECC 메모리 용으로 설계되었으며 Windows에서 가능한 결함을 감지하고 해당 PFN을 불량으로 표시 할 수 있지만 PFN을 수동으로 목록에 추가 할 수 있습니다. superuser.com/a/490522/117590- 그다지 실용적이지는 않습니다. 따라서 교체가 최선의 선택입니다 .P
Bob

17

Windows BCD (부팅 구성 데이터)에는 실제로 {badmemory}개체가 있습니다. ECC 메모리에서 "실패한 것으로 예상되는"메모리 주소가 여기에 나열되고 운영 체제에서는 사용되지 않는 것 같습니다.

{badmemory}목적은 수락 BadMemoryList(BCD 형 0x1700000a공간으로 구분 진수로 입력 할 수있는 정수의리스트 임) 소자. memtest86에 의해 발견 된 잘못된 메모리 주소를이 요소에 수동으로 삽입하는 것이 가능할 것이라고 생각하지만 테스트하지는 않았습니다. 분명히 실제 주소를 4096으로 나눈 '페이지 프레임 번호'를 허용합니다. 불행히도, 이러한 주소 / PFN은 메모리 진단에서보고 된 주소와 일치하지 않을 수 있습니다. Visual BCD Editor를 사용 하여 수동 편집을 수행 할 수 있습니다 .

어쨌든 결함이있는 메모리 스틱은 다른 답변으로 표시된대로 교체해야합니다. 이것은 문제를 해결할 수있는 가능한 방법에 대한 메모 일뿐입니다 (일시적으로?).


당신이 말한 모든 것에 대한 더 나은 형식의 튜토리얼은 여기에서 볼 수 있습니다 . 그래도 좋은 일입니다.
mirh

13

윈도우 BCD는이 {badmemorylist}{badmemoryaccess}객체. 첫 번째는 불량 메모리 페이지를 공백으로 구분하여 (예 :) bcdedit /set badmemorylist 1499543 1434007두 번째는 No( bcdedit /set badmemoryaccess No)로 설정해야합니다.

일반적으로 Windows의 메모리 페이지 크기는 4KB

Windows 7에서 테스트되었으며 잘 작동합니다.

Sysinternals의 Rammap으로 설정을 테스트 할 수 있습니다

추신 : 나는 그 정보를 "Windows Internals Book" chapter 10


13

SoC가 포함 된 태블릿에서 RAM에 문제가있었습니다. 메모리는 SoC에 용접 또는 통합되어 있으며 교체 할 수 없습니다.

나는 아르헨티나에 있고 판매자는 중국에 있으며 배송 비용과 시간은 보증으로 보내는 것이 의미가 없습니다.

나는 몇 안타를 관리했다.

손상된 메모리 매개 변수를 전달하는 열쇠는 다음과 같습니다.

  1. memtest86의 주소는 Windows에서 사용 된 주소와 일치합니다.
  2. 4KBytes의 전체 페이지를 표시해야합니다.
  3. memtest의 0x10000000Windows의 0x10000에 해당합니다.
  4. memtest의 0x00001000Windows의 0x1에 해당합니다.
  5. 의미 : 창의 페이지 번호는 마지막 3 개의 가장 가까운 16 진수를 제거합니다.
  6. 즉, Windows는 왼쪽의 0을 제거합니다.
  7. 페이지 번호의 오류를 피하려면 5와 6을 고려하십시오.
  8. 올바른 문장은 bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA0x000B7000에서 0x000BAFFF까지 memtest의 오류입니다. 다양한 메모리를 넣을 수는 없지만 모든 페이지를 하나씩
  9. 페이지를 추가 할 수없는 경우 모든 페이지를 동일한 명령으로 표시해야합니다. 새 페이지 인 경우 추가가 이전을 덮어 씁니다. 나는 유일한 명령으로 4096 페이지를 추가 할 수있었습니다. 나는 그것을 더 시도하지 않았습니다.
  10. bcdedit /enum {badmemory}에는 표시된 페이지 목록이 표시됩니다.
  11. bcdedit /set badmemoryaccess no 표시된 페이지가 사용되는 것을 방지
  12. 페이지를 표시 한 후 재부팅하고 액세스를 제거해야합니다.

1
나는 사이의 공백을 제거해야 /작업에 대한 명령을, 그래서 대신 bcdedit / enum {badmemory}이 될 것 bcdedit /enum {badmemory}외에는 동일
flagg19

작동하지만 불행히도 Windows의 cmd 제한은 8191로 제한되어 있으며 모든 불량 메모리 페이지를 차단할 수 없었습니다. 이 문제를 해결하는 좋은 해결 방법을 찾을 수 없습니다. 페이지 범위를 기록하는 방법이 있습니까? 너무 많은 페이지 인 0x714bc8에서 0x71cbd0까지의 모든 페이지를 차단해야합니다! 내가 무엇을 했습니까? 가장 간단한 테스트 (# 0 및 # 1)를 실행했으며 더 제한된 범위의 메모리 오류가 발생했습니다. 더 이상 블루 스크린이 없어 지금까지 잘 돌아가고 있습니다. 그러나 필요한 모든 것을 차단하지는 않았습니다.
펠리페

3

내가 아는 한,이 작업을 수행하는 유일한 방법은 RAM 창 사용을 ​​인위적으로 제한 할 수있는 BurnMem 명령을 사용하는 것입니다.


2
흠 .. 흥미로운 옵션입니다. 아마도 최대 물리적 주소를 제한하지 않기 maxmem때문에 아마도 그렇습니다 . Vista와 7에 해당합니다 . 이것이 가능한 해결책이지만 결함있는 메모리가 주소 공간의 중간이나 시작 부분에 있고 원하지 않는 모든 것을 차단하는 경우에 더 정확한 방법이 있습니까? burnmemmaxmemtruncatememory
Bob

@ Bob-나쁜 메모리 모듈을 단순히 대체 할 수없는 이유는 무엇입니까?
Ramhound

원한다면 @Ramhound 할 수 있습니다. 그러나 시간이 걸릴 것입니다. 지금은 원래 메모리의 절반으로 실행 중이며 VM에는 적합하지 않습니다. 실제로 작동하는 새 모듈이나 교체 모듈을 얻는 데 몇 주가 걸릴 수 있습니다. 소프트웨어 솔루션을 통해 2 시간 이내에이 작업을 수행 할 수 있다면 시간이 많이 걸리고 새로운 점이 있다고 생각합니다. 나는이 대답을 받아 들일 것입니다 (주소 공간의 끝에서 메모리가 바로 실패했습니다). 그러나 누군가가 더 다재다능한 솔루션을 가지고 있다면 나중에 참조하기를 선호합니다.
Bob

@Bob-방금 이것에 대해 광범위하게 읽으면 불가능한 것으로 보입니다. 이는 BadRam이 memtest를 사용하여 커널에 부트 로더에서 잘못된 주소를 제외하도록 지시하기 때문입니다. 현재 BadRam 패치 커널과 동일한 방식으로 배드 주소를 제외 할 방법이 없기 때문에 Windows에서는이를 수행 할 수 없습니다. .
Oliver G

3

이 유틸리티를보십시오 : https://github.com/prsyahmi/BadMemory

사용이 매우 쉽고 주소 범위 차단을 지원합니다. 마지막 세 자리를 제거하지 않고도 MemTest86에서받은 전체 주소를 사용할 수 있습니다.


2

주의!!! Windows가 부팅되지 않고 BCD를 다시 작성할 준비가되었습니다. 이 경우 고급 시작 옵션의 명령 프롬 트를 사용하십시오. 더 이상 부팅되지 않는 이유를 모르겠습니다. 무작위로 발생하거나 너무 많은 Adresses를 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 C ++ 명령 .txt 파일에 준비가 연속 메모리 ADRESS의 목록을 가져옵니다 프롬프트 programm에 bcdedit /set badmemorylistbcdedit /set {badmemory} badmemorylist(나를 위해 Win7에 작업을하지 않았다)

bcdedit /set badmemoryaccess 0액세스를 거부하는 데 사용 합니다.

보기 설정-> 상세에서 EasyBCD로 확인할 수 있습니다. 물리적 주소 공간이 사라진 경우 Rammap으로 확인하여 다시 시작한 후.

#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;
}

1

예. 윈도우가 사용할 수있는 메모리 양을 제어하는 ​​부팅 매개 변수가 있습니다. 그래도 메모리 공간의 끝에서만 제거 할 수 있습니다. 부팅 매개 변수를 제어하려면 이 msdn 기사를 참조하십시오 . 관심있는 매개 변수는 truncatememoryremovememory입니다.


메모리 잘라 내기 및 제거 는 RAM 액세스를 차단하는 것 같습니다 (주어진 임계 값에서 시작하거나 끝에서 뒤로 작업). 이 질문은 범위를 제공하는 것에 관한 것이 었습니다.
mirh

0

Windows 7 에서이 기능을 사용해 볼 수는 있지만 어떤 칩이 어떤 칩에 영향을 미치는지 또는 각 칩에서 같은 양의 칩을 제거하는지 확실하지 않습니다. 나는 그것을 찾아 주변을 둘러 봐야 할 것이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.