간혈적 재 부팅 x86, x64 호환 시스템의 windbg 와 passmark 의 memtest86을 이용한 디버깅
서론,
폰 노이만 구조를 따르는 전통적 인텔 호환 컴퓨터시스템은 일련의 주 기억장치의 적재된 명령을 CPU 의 레지스터에서 연산하여 그 결과를 다시 메모리로 반환하는데, 그 과정에서 잘못된 CPU 레지스터(연산)에 의해 재부팅이 발생한 내용을 추적하면서 메모리 오류를 찾아내고 이에 대한 결과를 추적했던 내용에 대한 이슈를 소개하는 내용입니다.
이 이슈가 발생하기전 x86,x64 호환 시스템(윈도우 운영체제) 에서 응용프로그램 동작 또는 시스템 운영시에 간혈적으로 시스템이 재부팅하는 문제가 발생하여, 커널 덤프를 통해 시스템을 분석하였습니다.
1. < 7월 15일 오후 10시 01분>
– 071522-94031-01.dmp 파일
- windbg 를 이용하여 dump 파일을 분석하였을때 register value 에 이상이 생긴것으로 CODE_CORRUPTION 이 발생하였습니다.
- Windows kernel 에서 발생한 Stack 을 보았을때 페이징이 되지 않는 실제 메모리에서 발생한 것으로 보인다.
이 원인으로 7월 15일 경 시스템이 강제 재부팅이 되었습니다. 이 오류는 제어판의 이벤트 뷰어를 통해 확인할 수 있었습니다. (시스템 재시작에 대한 단순 원인을 이벤트 뷰어로 확인하고 재부팅시 kernel dump 파일을 생성하도록 하여 디버깅을 진행하였습니다)
2. < 7월 17일 오후 09시 24분>
– 071722-92359-01.dmp 파일
– 1번증상과 마찬가지로 CPU 의 레지스터 연산 과정에서 문제가 발생하였습니다. 물리 메모리에서 잘못된 레지스터 연산이 일어나서 윈도우 가상 메모리 시스템에서 이를 ‘PageFault’ 라고 추적한 stack 기록이 보입니다.
3. 상기 원인으로 물리 메모리의 하드웨어적인 문제(지정 어드레스에 따른 데이터 버스에서 메모리의 데이터 신뢰성을 의심할 수 있습니다.)
운영체제를 배제하고 메모리의 전체 영역을 임의의 HEX 로 Write 하여 Read 한 값과 verification 을 해보는 툴을 이용해 보았습니다.
https://www.memtest86.com/download.htm
상기 url 에서 Passmark software 에서 제공하는 메모리 테스트 도구를 이용하여 테스트를 해본 결과 아래 사진과 같이 물리 메모리 블록에서 오류가 있음을 확인하였습니다.
아래 하단의 빨간색으로 표시된 바와 같이 7개의 메모리 에러가 17분만에 발생함을 알 수 있습니다. 해당 오류는 물리 메모리 주소에 임의의 16진수(Pattern) 데이터를 데이터를 기록해서 이를 기록한 값과 다시 읽어 들인 값을 비교했을때 오류가 있는 것이므로 Verification Error 입니다.
이 문제는 CPU 와 연계된 메모리 불량으로 의심할 수 있으며 하드웨어적인 문제로 해당 소자를 교체하거나 메인보드의 Memory extension IC 또는 해당 부분을 점검하여야 합니다.
-결론
윈도우 운영체제의 IoT 도입시에 종래 PLC 나 기타 다른 임베디드 기기와 달리 운영체제의 복잡도 증가와 PCB Layout 시 소형 공간의 제약으로 인해 부품간 영향을 많이 받는 경우가 많고,
특히 최근 중국산 제품들의 IC 재사용문제로 더불어 x86, x64 시스템의 신뢰성이 상당히 낮은 경우(간혈적 재부팅 및 시스템이 halt 되거나 hangup되는 문제) 사전에 이러한 운영체제 배제 시험을 통해 하드웨어를 먼저 검증하는 것이 매우 중요합니다.