80386 마이크로코드 역어셈블됨
요약
고해상도 다이 이미지를 활용하여 Intel 80386 마이크로코드를 역어셈블하고 복원하는 과정을 다룹니다. CNN을 이용한 비트 분류와 리버스 엔지니어링을 통해 구형 프로세서의 내부 동작 원리를 분석하는 기술적 여정을 설명합니다.
핵심 포인트
- 고해상도 다이 이미지에서 트랜지스터를 인식하여 마이크로코드 추출
- CNN(합성곱 신경망)을 활용한 0과 1 비트 분류 및 오류 검수
- 80386 리비전 식별을 위한 EDX 로드 값 분석
- 마이크로코드와 일반 명령어 세트의 구조적 차이 설명
고해상도 다이 이미지에서 어떻게 마이크로코드를 복원할 수 있는지 궁금함
과정이 각 트랜지스터를 인식해서 회로를 모델링하는 건지, 결과물이 Verilog 같은 형태인지도 알고 싶음
추출 과정에 조금 참여했는데, 먼저 마이크로코드 배열의 행과 열이 만나는 위치를 기준으로 모든 비트의 x,y 좌표를 표시함
그다음 0과 1을 분류하는데, 1은 트랜지스터 존재와 폴리실리콘의 틈으로 시각적으로 구분됨
Intel 마이크로코드 특성상 0이 훨씬 많다고 가정할 수 있어서, 트랜지스터가 있으면 1로 봤음
색상 임계값으로 자동 처리하는 도구도 있지만, 모자이크 일부가 흐리고 먼지가 들어가 가짜 1비트가 많이 생겨 잘 안 맞았음
대신 합성곱 신경망으로 추출한 비트 영역을 0/1로 분류하게 학습시키고, 결과를 원본 모자이크 위에 흰색/검은색 사각형 50% 불투명도로 덮어 확인했음
이후 며칠 동안 지루하게 오류를 검수했고, 최종적으로 원시 2차원 비트 배열을 얻었으며 다음 단계는 그 배열에서 마이크로코드 워드를 추출하는 것임
이 마이크로코드를 리버스 엔지니어링하는 데 필요한 노력이 인상적이고, 386 아키텍처를 깊게 파고든 훌륭한 글임
실제 마이크로코드 구현을 보면 오래된 프로세서가 복잡한 연산을 어떻게 처리했는지 덜 신비롭게 느껴짐
386은 22년 생산 기간 동안 작은 변경이 많았기 때문에, 이 코드가 어느 386 리비전에서 나온 것인지 아는 게 중요함
한 가지 단서는 리셋 시 EDX에 로드되는 값임 9B5 BIST1 -> TMPD 0x0303 PASS2 9B6 SIGMA -> EDX 9B7 BIST2 -> TMPE TMPD XOR 9B8 SIGMA 0x3ddc0c2c XOR 9B9 SIGMA -> EAX BOOTUP_JUMP JFPUOK 0x303은 제품군 3, 모델 0, 스테핑 ID 3을 뜻함
이걸 해독하는 데 필요한 블랙박스 분석은 엄청 어렵지만, 성공하면 굉장히 재미있고 보람도 클 것 같음
이런 글을 이해하려고 대학에서 어려운 과목을 들었던 게 만족스럽고, 2015년 당시 HN이 그런 사고를 자극해준 것도 좋았음
지금은 저수준 프로그래밍 지식을 크게 쓰지 않더라도, 이런 글을 읽을 때마다 의식이 풍부해지는 느낌이 들어 멋짐
대학에 접근하기 어려운 사람에게는 nand2tetris.org를 추천함
nand2tetris를 몇 번 해봤지만, 모든 추상화 수준에서 단순함을 강조하기 때문에 마이크로코드 같은 것은 건너뜀
그 단순함 자체는 훌륭한 교훈이고 많은 영감을 줬지만, 1990년대 대학에서 들은 전기공학 수업은 nand2tetris와 비슷하게 8086류 CPU가 어떻게 만들어지는지 다루면서도 마이크로코드 동작을 설명했음
내부 프로그램 카운터가 제어 워드 테이블을 따라가고, 각 비트가 CPU의 제어 가능한 부분을 직접 조율하는 식이었음
각자 시뮬레이터에서 명령 하나를 구현했는데, 나는 DEC, 즉 감소 명령을 맡았음
어떤 의미에서는 nand2tetris의 명령어가 마이크로코드라고 볼 수도 있음
명령어 비트가 하드웨어를 직접 제어하고 첫 비트가 두 종류의 명령을 고르므로, 명령 하나당 코드 단계가 1개뿐임
반면 마이크로코드는 명령 하나가 임의 개수의 마이크로코드 단계를 가질 수 있음
Ben Eater의 브레드보드 8비트 CPU 영상에서는 명령어의 4비트 연산 코드와 단계 카운터로 ROM을 인덱싱해 제어 워드를 정함
이 ROM은 충분히 복잡한 논리 게이트로도 만들 수 있는 부분을 대신하며, 전자회로를 직접 만지고 문제를 해결해야 하므로 하드웨어 쪽 다음 단계로 좋음
다만 RAM이 16바이트뿐이라 nand2tetris처럼 더 높은 추상화 계층을 만들기 어렵다는 점은 아쉬움
그 시점에서는 더 나은 설계로 다시 만들거나 PCB에 올리거나, 6502 프로젝트로 넘어가 타이머, CPU, ROM, RAM, 입출력, UART 등을 하나로 묶어 생각한 뒤 이미 그런 것들이 합쳐진 마이크로컨트롤러로 넘어갈 수 있음
논리 게이트로 CPU를 만드는 방법을 읽고 싶다면 Charles Petzold의 Code는 느리게 설명하고 최근 개정됐으며, Danny Hillis의 Pattern on the Stone은 더 빠르게 진행됨
Code 2판은 4비트 사이클 카운터와 하드와이어드 논리 게이트로 각 사이클 동작을 정하고, 일부 논리에 다이오드 배열을 쓰는데 이것도 마이크로코드로 봐야 하는지 궁금함
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기