TECH 으로 돌아가기
TECH HACKER NEWS 8분 읽기 22 READS

BIOS 복구를 막는 BIOS 오류: 띵크패드 750C의 역설적 수리기

1990년대 중반 IBM 노트북을 다뤄본 사람이라면 부팅 화면에 뜨는 숫자 오류 코드에 익숙할 것이다. 그중 I9990303은 특히 성가신 축에 속한다. 1994년경 출시된 486SL 33MHz 기반 띵크패드 750C에서 이 오류가 발생하면 정상 부팅이 막히는 것은 물론이고, 보통 다른 오류라면 강제로 진입하게 되는 BIOS 셋업 화면조차 들어갈 수 없다. 설정을 바꿀 길이 원천 차단되는 셈이다. IBM의 하드웨어 정비 매뉴얼은 이 코드를 '시스템 보드 결함'으로 규정하면서, 강한 자기장 노출로도 발생할 수 있다는 다소 묘한 단서를 덧붙여 두었다.

흥미로운 점은 기기 자체가 완전히 죽은 것이 아니라는 데 있다. 특수 표식이 붙은 IBM 정비용·BIOS 업데이트용 플로피로는 여전히 부팅이 가능하고, 그 상태에서 DOS로 들어가 내장 하드디스크나 PC 카드에 접근하거나 윈도우 3.1까지 구동할 수 있다. 즉 런타임 BIOS는 멀쩡한데 셋업과 진단을 담당하는 ROM 영역만 손상된 정황이다. 실제로 후속 모델인 760에서는 같은 코드가 'Bank-2 플래시 ROM 체크섬 오류'로 문서화되어 있어, 펌웨어 일부가 부분적으로 깨졌다는 해석에 힘을 싣는다.

재플래시가 고치는 손상이 재플래시를 막는다

해법은 명백해 보인다. 손상된 펌웨어는 BIOS를 다시 써 넣으면 거의 틀림없이 복구된다. 문제는 IBM의 플래시 도구가 작동하지 않는다는 것이다. 이 도구는 충전된 배터리를 요구하는데, 필자에게는 멀쩡한 배터리가 없었다. 그런데 도구는 배터리 상태를 확인하는 단계까지 가지도 못하고 '시스템 전원 관리가 비활성화되어 있다'는 메시지와 함께 먼저 멈춰버린다. PS2 유틸리티가 먹통이 된 것과 같은 뿌리의 문제로 추정된다. 여기서 역설이 완성된다. 펌웨어의 비핵심 영역이 손상됐고, 그 손상은 재플래시로 고칠 수 있는데, 정작 재플래시 도구가 바로 그 손상 때문에 실행되지 않는다.

우회로를 찾기도 쉽지 않았다. 업데이트 플로피는 사실상 UPDTFLSH.EXE를 곧바로 실행하는 커스텀 셸을 얹은 부팅용 DOS 디스크에 불과하지만, 정작 이 실행 파일에는 명령행 인자도, 환경 변수도, 동작을 바꿀 어떤 손잡이도 없었다. 결국 남은 선택지는 검사 루틴 자체를 건너뛰도록 도구를 수정하는 것이었다. 당연히 위험한 일이다. 이 시절 플래시 BIOS 시스템에는 부트 블록 같은 안전장치가 없어서, 업데이트가 중간에 실패하면 기기는 그대로 벽돌이 된다. 노트북이 굳이 충전된 배터리를 고집하는 이유도 전원 차단이라는 가장 흔한 실패 원인에 대비한 보험이기 때문이다. 다만 이미 고장 난 기기였기에, 필자는 위험을 감수할 가치가 있다고 판단했다.

486SL의 SMM 전원 관리 뜯어보기

UPDTFLSH.EXE를 디스어셈블해 보니 문서화되지 않은 동작이 가득했지만, 오류 메시지가 코드 흐름을 읽는 좋은 실마리가 됐다. 750C는 486SL의 SMM(시스템 관리 모드)으로 전원 관리를 구현하며, 이는 랠프 브라운의 인터럽트 리스트에 일부만 기록된 인터페이스다. 도구는 먼저 INT 15h/5380h를 BH=7Eh로 호출해 'SL 제어 포트'를 받아온 뒤, CH·CL·BL에 49h·42h·4Dh, 즉 ASCII로 'IBM'을 채워 넣고 AX를 다시 5380h, BH를 F0h로 설정한 다음 OUT 명령으로 그 포트에 써 넣는다. 일종의 존재 확인 절차다. 이 인터페이스는 소프트웨어 인터럽트처럼 동작하지만 처리가 별도 주소 공간의 SMM에서 이뤄지므로 I/O 포트 쓰기로 트리거된다. 캐리 플래그가 서지 않으면 검사가 통과된 것으로 보고, 이후 확장 유닛 장착 여부나 배터리 설치·충전 상태를 잇따라 점검한다. 필자는 첫 코드 세그먼트의 오프셋 CC4h에 있는 루틴을 통째로 패치해 AX에 항상 0을 돌려주도록 만들었다. EXEPACK으로 압축돼 있어 풀었다 다시 묶는 수고가 따랐을 뿐이다.

패치된 도구는 전원 관리 관련 오류를 건너뛰고 실제 플래시 과정을 시작했다. 결과는 성공이었다. 재부팅 후 I9990303 오류는 사라졌고, BIOS 셋업에 들어갈 수 있게 됐으며 정상 부팅도 회복됐다. CMOS 내용 소실로 뜨던 161·163 오류까지 설정을 통해 정리됐고 PS2 유틸리티도 되살아났다. 결국 이 오류는 플래시 메모리 손상을 가리키는 것이 거의 확실하다. EPROM이나 플래시는 영원하지 않아 간혹 비트 하나를 '잊어버리고', 보통은 내용을 다시 써 넣으면 해결된다. 다만 I9990303의 경우 그 해결책에 이르는 길 자체가 막혀 있다는 점이 문제였고, 이는 의도치 않은 설계상의 부작용으로 보인다.

체크섬은 걸되 복구는 염두에 두지 않았다

논의 과정에서 나온 추측은 설득력이 있다. 당시 개발자들은 ROM 체크섬이 틀리면 보드 자체가 수명을 다한 것으로 간주했을 뿐, 그것이 비교적 쉽게 고칠 수 있는 문제일 가능성은 미처 상정하지 못했다는 것이다. 체크섬을 넣었다는 것은 손상 가능성을 어느 정도 염두에 뒀다는 뜻이지만, 손상 이후의 복구 경로까지 설계하지는 않은 셈이다. 아쉬운 대목은 필자가 복구에만 몰두한 나머지 플래싱 전 원본 BIOS를 백업해 두지 않아, 실제로 몇 개의 비트가 뒤집혔는지 확인할 기회를 놓쳤다는 점이다.

기술사적 배경도 이 이야기를 풍부하게 한다. 750C는 마이크로채널을 쓰던 초기 IBM 휴대용 기기와 달리 ISA 기반이지만 여전히 PS/2 계열로, 모델 바이트가 32비트 PS/2 시스템 전반이 쓰는 F8h다. 반면 PC/AT 호환기는 FCh를 쓰며 760 이후 모델이 여기에 해당한다. 즉 750·755는 PS/2 E와 가까운 친척뻘 ISA PS/2이고, 760이 첫 비(非)PS/2 띵크패드였다는 정리가 가능하다. 플래시 BIOS의 보급 시점을 두고도 의견이 오갔는데, IBM은 1993년 중반 띵크패드 750과 PS/2 E, 모델 53, 갱신된 모델 95 등에 플래시 BIOS를 적용했고 비슷한 시기 인텔의 펜티엄 레퍼런스 보드 'Batman'도 플래시 BIOS를 달았다. 대중적인 메인보드로 플래시 BIOS가 흔해진 것은 대략 1994년 펜티엄 보드부터라는 기억이 이를 뒷받침한다. 30년 가까이 묵은 노트북 한 대의 복구담이지만, 펌웨어 비트가 서서히 썩어가는 오래된 IC들을 어떻게 다룰 것인가라는, 레트로 하드웨어 보존의 현실적인 숙제를 함께 던진다.

SOURCE · HACKER NEWS
원문 전체 보기 → http://www.os2museum.com/wp/thinkpad-i9990303-error-catch-22...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...