결함이있는 RAM 모듈로 Windows (7, x64)를 실행할 수 있습니까? 보다 정확하게는 Windows에 알려진 잘못된 주소 나 주소 블록을 할당하지 않도록 지시하는 방법이 있습니까?
Linux의 경우 BadRAM이 있습니다. 기존의 Windows 구현이 있습니까? Windows 커널 (NT 6.1)에서도 가능합니까? 커널 모드 드라이버일까요?
답변
밥, 질문에는 세 부분이 있습니다. 한 번에 하나씩 설명하겠습니다.
메모리가 나쁜 Windows 실행
실제로 결함이있는 모듈로 Windows 7을 실행할 수 있습니다. 불량 섹터의 위치와 모듈이 DIMM 뱅크에있는 위치에 따라 Windows 7은 메모리의 불량 부분을 건드리지 않는 한 아무 것도없는 것처럼 실행됩니다. 따라서 이상적으로 결함이있는 모듈을 뱅크 0에서 가능한 멀리 떨어 뜨려 놓는 것이 이상적입니다. 당연히 이것이 유일한 모듈 인 경우 운이 좋지 않습니다.
Windows에서 불량 메모리 섹터 차단
x86 (32 및 64 비트) 운영 체제에서 메모리는 커널에 의해 관리됩니다. 언급했듯이 BadMem은 Linux에서 불량 메모리 섹터를 차단할 수 있습니다. 커널이 지정한 메모리 주소를 잠그도록 지시함으로써 작동합니다. 이렇게하면 메모리를 할당 (및 할당 해제) 할 때 Linux가 해당 주소를 처리하지 못하게됩니다. 그러나이를 위해 BadMem은 커널을 패치해야합니다. BadMem은 적용하기 전에 구성하는 커널 패치에 지나지 않습니다.
이제 Windows에는 해당 기능이 없습니다. 커널을 패치 할 수 없습니다. Windows 커널은 드라이버가 메모리 관리 아키텍처보다 우선시하지 않기 때문에 커널 모드 드라이버를 개발해도 아무런 효과가 없습니다.
따라서 특정 메모리 주소를 사용하지 않도록 창에 지시 할 수 없습니다. 유일한 방법은 Microsoft가 귀하의 경우에 맞게 커널을 패치하는 것입니다. 있을 것 같지 않게.
잘못된 메모리 주소 확산
메모리 모듈에 잘못된 주소가 포함될 수있는 많은 이유가 없습니다. 궁극적으로 컴퓨터에 들어가기 전에 손상을 입지 않았다고 가정하면 생산 라인의 오류로 귀결됩니다. 하드 드라이브와 달리 메모리 모듈에는 움직일 수있는 부품이 없습니다. 따라서 하드 드라이브 섹터와 마찬가지로 불량 섹터는 확산되지 않습니다.
그러나 메모리 테스트 소프트웨어는 완벽하지 않습니다. 실제로 나쁜 특정 주소를 전달하는 것이 가능하고 일반적입니다. 따라서 더 많은 주소가 나쁘면 메모리가 잘못되면 “확산”이라는 인상을 줄 수 있습니다. 이러한 이유로 BadMem과 같은 도구는 약점을 드러냅니다. 왜냐하면 사용자가 지시 한 주소 만 처리 할 수 있기 때문입니다.
누구나 메모리 모듈에 대한 철저한 테스트를 수행하고 모든 불량 메모리 주소를 식별 한 다음이를 잠그고 “좋은”메모리 모듈로 끝날 가능성은 거의 없습니다. 가장 쉬운 방법은 잘못된 주소를 가진 모듈을 전체적으로 결함이있는 모듈로 간주하여 신뢰할 수없는 것으로 간주하는 것입니다.
이것이 의미하는 바는 BadMem이 매력적인 제안만큼이나 실제로 나쁜 메모리 문제에 대한 해결책이 아니라는 것입니다. 아마도 불량 섹터를 읽으려고 시도하고 중지 오류와 충돌하는 운영 체제로 끝나지 않을 가능성이 큽니다. 불량 모듈은 불량 모듈은 불량 모듈입니다.
답변
Windows BCD (부팅 구성 데이터)에는 실제로 {badmemory}
개체가 있습니다. ECC 메모리에서 “실패한 것으로 예상되는”메모리 주소가 여기에 나열되고 운영 체제에서는 사용되지 않는 것 같습니다.
{badmemory}
목적은 수락 BadMemoryList
(BCD 형 0x1700000a
공간으로 구분 진수로 입력 할 수있는 정수의리스트 임) 소자. memtest86에 의해 발견 된 잘못된 메모리 주소를이 요소에 수동으로 삽입하는 것이 가능할 것이라고 생각하지만 테스트하지는 않았습니다. 분명히 실제 주소를 4096으로 나눈 ‘페이지 프레임 번호’를 허용합니다. 불행히도, 이러한 주소 / PFN은 메모리 진단에서보고 된 주소와 일치하지 않을 수 있습니다. Visual BCD Editor를 사용 하여 수동 편집을 수행 할 수 있습니다 .
어쨌든 결함이있는 메모리 스틱은 다른 답변으로 표시된대로 교체해야합니다. 이것은 문제를 해결할 수있는 가능한 방법에 대한 메모 일뿐입니다 (일시적으로?).
답변
윈도우 BCD는이 {badmemorylist}
와 {badmemoryaccess}
객체. 첫 번째는 불량 메모리 페이지를 공백으로 구분하여 (예 🙂 bcdedit /set badmemorylist 1499543 1434007
두 번째는 No
( bcdedit /set badmemoryaccess No
)로 설정해야합니다.
일반적으로 Windows의 메모리 페이지 크기는 4KB
Windows 7에서 테스트되었으며 잘 작동합니다.
Sysinternals의 Rammap으로 설정을 테스트 할 수 있습니다
추신 : 나는 그 정보를 "Windows Internals Book" chapter 10
답변
SoC가 포함 된 태블릿에서 RAM에 문제가있었습니다. 메모리는 SoC에 용접 또는 통합되어 있으며 교체 할 수 없습니다.
나는 아르헨티나에 있고 판매자는 중국에 있으며 배송 비용과 시간은 보증으로 보내는 것이 의미가 없습니다.
나는 몇 안타를 관리했다.
손상된 메모리 매개 변수를 전달하는 열쇠는 다음과 같습니다.
- memtest86의 주소는 Windows에서 사용 된 주소와 일치합니다.
- 4KBytes의 전체 페이지를 표시해야합니다.
- memtest의
0x10000000
Windows의 0x10000에 해당합니다. - memtest의
0x00001000
Windows의 0x1에 해당합니다. - 의미 : 창의 페이지 번호는 마지막 3 개의 가장 가까운 16 진수를 제거합니다.
- 즉, Windows는 왼쪽의 0을 제거합니다.
- 페이지 번호의 오류를 피하려면 5와 6을 고려하십시오.
- 올바른 문장은
bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA
0x000B7000에서 0x000BAFFF까지 memtest의 오류입니다. 다양한 메모리를 넣을 수는 없지만 모든 페이지를 하나씩 - 페이지를 추가 할 수없는 경우 모든 페이지를 동일한 명령으로 표시해야합니다. 새 페이지 인 경우 추가가 이전을 덮어 씁니다. 나는 유일한 명령으로 4096 페이지를 추가 할 수있었습니다. 나는 그것을 더 시도하지 않았습니다.
bcdedit /enum {badmemory}
에는 표시된 페이지 목록이 표시됩니다.bcdedit /set badmemoryaccess no
표시된 페이지가 사용되는 것을 방지- 페이지를 표시 한 후 재부팅하고 액세스를 제거해야합니다.
답변
내가 아는 한,이 작업을 수행하는 유일한 방법은 RAM 창 사용을 인위적으로 제한 할 수있는 BurnMem 명령을 사용하는 것입니다.
답변
이 유틸리티를보십시오 : https://github.com/prsyahmi/BadMemory
사용이 매우 쉽고 주소 범위 차단을 지원합니다. 마지막 세 자리를 제거하지 않고도 MemTest86에서받은 전체 주소를 사용할 수 있습니다.
답변
주의!!! 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 badmemorylist
나 bcdedit /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;
}