인텔 마이크로코드

인텔 마이크로코드(Intel microcode)는 인텔이 제조한 x86 프로세서 내부에서 실행되는 마이크로코드이다. 1990년대 중반에 도입된 P6 마이크로아키텍처 이후, 마이크로코드 프로그램은 출시 후 CPU에서 발견된 버그를 해결하기 위해 운영 체제 또는 바이오스 펌웨어에 의해 패치될 수 있다. 인텔은 원래 디자인 포 테스트(DFT) 이니셔티브에 따라 프로세서 디버깅을 위한 마이크로코드 업데이트를 설계했다.

펜티엄 FDIV 버그 이후, 패치 가능한 마이크로코드 기능은 제품 리콜을 할 필요 없이 현장에서 업데이트를 허용하는 더 넓은 목적을 갖게 되었다.

P6 및 이후 마이크로아키텍처에서는 x86 명령어가 특정 프로세서 및 스테핑 수준에 특정한 더 단순한 RISC 스타일의 마이크로 오퍼레이션으로 내부적으로 변환된다.

P6 이전 마이크로코드
인텔 80486 및 AMD Am486에는 약 5000줄의 마이크로코드 어셈블리가 있으며, ROM에 저장된 총 약 240 Kbits이다.

P6 및 이후 마이크로 오퍼레이션

펜티엄 프로부터, 대부분의 인텔 x86 프로세서에서는 명령어 인출 및 디코더 유닛에 의해 프로세서에 특정한 마이크로 오퍼레이션 시퀀스로 변환되어 프로세서에 의해 직접 실행된다. 마이크로코드에 구현된 명령어의 경우, 마이크로코드는 온칩 메모리에서 인출된 마이크로 오퍼레이션으로 구성된다.

펜티엄 프로에서는 각 마이크로 오퍼레이션은 72비트 너비 또는 118비트 너비이다. 여기에는 Opcode, 두 개의 소스 필드 및 하나의 대상 필드가 포함된다. 32비트 즉시 값을 저장할 수 있는 기능이 포함된다. 펜티엄 프로는 내부 마이크로코드 에서 패리티 에러를 감지하고 이를 머신 체크 아키텍처(Machine Check Architecture)를 통해 보고할 수 있다.

마이크로 오퍼레이션은 최대 세 개의 소스 입력과 두 개의 대상 출력을 갖는 일관된 형식을 갖는다. 프로세서는 실행 전후에 이러한 입력을 실제 레지스터 파일(RRF)로 매핑하기 위해 레지스터 이름 변경을 수행한다. 비순차적 명령어 처리가 사용되므로 마이크로 오퍼레이션 및 해당 오퍼레이션이 나타내는 명령이 동일한 순서로 나타나지 않을 수 있다.

펜티엄 프로 개발 중, A2 및 B0 스테핑 사이에 여러 마이크로코드 수정 사항이 포함되었다. 펜티엄 II (P6 펜티엄 프로 기반)의 경우, MMX (명령어 집합)을 지원하기 위해 추가 마이크로 오퍼레이션이 추가되었다. 여러 경우에, 희귀한 코너 케이스를 신뢰할 수 있는 방식으로 처리하기 위해 "마이크로코드 어시스트"가 추가되었다.

펜티엄 4는 동시에 126개의 마이크로 오퍼레이션을 수행할 수 있다. 마이크로 오퍼레이션은 12,000개의 항목이 있는 실행 추적 캐시에 디코딩되어 저장되므로 동일한 x86 명령어의 반복적인 디코딩을 피할 수 있다. 여섯 개의 마이크로 오퍼레이션 그룹은 트레이스 라인으로 묶인다. 마이크로 오퍼레이션은 동일한 캐시 라인 내에서 추가 즉시 데이터 공간을 빌릴 수 있다. 예외 처리와 같은 복잡한 명령어는 마이크로코드 ROM으로 점프하게 된다. 펜티엄 4 개발 중 마이크로코드는 프로세서 버그의 14%를 차지했으며, 펜티엄 프로 개발 중에는 프로세서 버그의 30%를 차지했다.

2006년에 도입된 인텔 코어 (마이크로아키텍처)는 비교 후 점프를 포함한 일부 일반적인 명령어 쌍에 대해 "매크로 오퍼레이션 융합"을 추가했다. 코어의 명령어 디코더는 x86 명령어를 세 가지 다른 방식으로 마이크로코드로 변환한다:
+ 코어에서 x86 명령어를 마이크로 오퍼레이션으로 변환 x86 명령어  x86 디코더  마이크로 오퍼레이션 공통  단순 디코더 × 3  1–3 대부분의 다른 명령어  복잡 디코더 × 1  ≤4 매우 복잡한 명령어  마이크로코드 시퀀서  많음

인텔의 하이퍼스레딩 구현을 위한 동시 멀티스레딩의 경우, 마이크로코드 ROM, 트레이스 캐시 및 명령어 디코더는 공유되지만, 마이크로 오퍼레이션 대기열은 공유되지 않는다.

업데이트 기능
1990년대 중반에 새로운 마이크로코드를 제공하는 기능은 처음에는 펜티엄 프로 바이오스 업데이트 기능이라고 불렸다. 사용자 모드 애플리케이션은 새로운 "바이오스 업데이트 데이터 블록"을 제공하기 위해 바이오스 인터럽트 호출을 수행해야 하며, 바이오스는 이를 부분적으로 검증하여 비휘발성 바이오스 메모리에 저장할 수 있으며, 이는 다음 부팅 시 설치된 프로세서에 제공될 수 있다.

인텔은 BUP_UTIL.EXE라는 프로그램을 배포했는데, 이 프로그램은 CHECKUP3.EXE로 이름이 변경되었으며 도스에서 실행할 수 있다. 여러 마이크로코드 업데이트 모음은 PEP6.PDB와 같이 .PDB 확장자로 숫자로 번호가 매겨져 연결되었다.

프로세서 인터페이스
프로세서는 내부 ROM에 저장된 마이크로코드 세트를 사용하여 부팅한다. 마이크로코드 업데이트는 별도의 SRAM과 마이크로코드 ROM 내에서 브레이크포인트 역할을 하는 "일치 레지스터" 세트를 채워 SRAM의 업데이트된 마이크로 오퍼레이션 목록으로 점프할 수 있게 한다. 마이크로코드 명령어 포인터(UIP)와 모든 일치 레지스터 사이에서 일치가 수행되며, 일치가 발생하면 SRAM에 저장된 업데이트된 마이크로코드의 해당 대상 마이크로코드 주소로 점프한다. 원래 P6 아키텍처에서는 SRAM에 60개의 마이크로 오퍼레이션을 위한 공간과 여러 개의 일치/대상 레지스터 쌍이 있다. ROM 마이크로코드에서 SRAM에 저장된 패치된 마이크로코드로 점프하는 데는 한 명령 주기가 걸린다. 일치 레지스터는 마이크로코드 일치 주소와 마이크로코드 대상 주소로 구성된다.

마이크로코드 업데이트를 시작하려면 프로세서가 보호 링 0 ("")에 있어야 한다. 대칭형 다중 처리 구성에서 각 CPU는 개별적으로 업데이트해야 한다.

업데이트는 eax 레지스터에 주소를 넣고, ecx = 0x79로 설정한 후, wrmsr(모델별 레지스터 쓰기)를 실행하여 시작된다.

마이크로코드 업데이트 형식
인텔은 마이크로코드 업데이트를 2,048(2킬로바이트) 바이너리 블롭으로 배포한다. 이 업데이트에는 업데이트 대상 프로세서에 대한 정보가 포함되어 있어 CPUID 명령어 결과와 비교하여 확인할 수 있다. 구조는 48바이트 헤더 뒤에 업데이트할 프로세서가 직접 읽도록 의도된 2,000바이트가 이어진다.
 마이크로코드 업데이트 과정에서 프로세서가 실행하는 마이크로코드 프로그램. 이 마이크로코드는 특수 레지스터를 사용하여 구성 요소를 재구성하고 활성화 또는 비활성화할 수 있으며, 브레이크포인트 일치 레지스터를 업데이트해야 한다.
 SRAM에 채워질 최대 60개의 패치된 마이크로 오퍼레이션.
 마이크로코드 업데이트 형식 이해를 어렵게 하기 위해 무작위 값으로 구성된 패딩.

각 블록은 다르게 인코딩되며, 2,000바이트의 대부분은 구성 프로그램 및 SRAM 마이크로 오퍼레이션 내용 자체보다 훨씬 작으므로 사용되지 않는다. 업데이트가 프로세서에 적용될 수 있는지에 대한 최종 결정 및 검증은 프로세서를 통한 복호화 과정에서 수행된다. 각 마이크로코드 업데이트는 특정 CPU 수정에 맞춰져 있으며, 다른 스테핑 수준의 CPU에서는 거부되도록 설계되었다. 마이크로코드 업데이트는 위변조 방지 및 검증 활성화를 위해 암호화된다.

펜티엄에는 두 개의 암호화 계층이 있으며, 정확한 세부 사항은 인텔이 명시적으로 하지 않았으며, 직원 10명 미만만이 알고 있다.

인텔 아톰, 네할렘 및 샌디브리지에 대한 마이크로코드 업데이트에는 17진수의 지수를 갖는 2048비트 RSA 모듈러스가 포함된 추가 520바이트 헤더가 포함된다.

+ 관찰된 인텔 마이크로코드 데이터 블록 길이 (바이트) 마이크로아키텍처  예시 프로세서  제공된 길이  기능적 길이  의심되는 인코딩 P6    2000  864; 872; 944; 1968  64비트 블록 암호 코어  PIII …   4048  3096 넷버스트  , , 셀러론  2000–7120  2000 + N*1024  체인 블록 암호 아톰, 네할렘,     976–16336  976 + N*1024; 5120  AES + RSA 서명

디버깅
확장 실행 추적을 활성화하기 위해 특수 디버깅 전용 마이크로코드를 로드할 수 있으며, 이는 브레이크포인트 모니터 핀을 통해 추가 정보를 출력한다. 펜티엄 4에서는 특수 마이크로코드를 로드하면 마이크로코드 확장 실행 추적 모드에 액세스할 수 있다. JTAG 테스트 액세스 포트(TAP)를 사용할 때, 브레이크포인트 컨트롤 레지스터 쌍은 마이크로코드 주소에서 브레이크를 허용한다.

1980년대 중반 NEC와 인텔은 마이크로코드 저작권에 대한 오랫동안 진행된 미국 연방 법원 소송을 벌였다. NEC는 인텔 8086 CPU의 2차 공급원으로서 NEC μPD8086을 사용하고 있었으며, 인텔과 장기적인 특허 및 저작권 크로스 라이선스 계약을 체결하고 있었다. 1982년 8월 인텔은 마이크로코드 구현에 대한 저작권 침해로 NEC를 고소했다. NEC는 클린룸 설계를 통해 자사 V20 및 V30 프로세서의 마이크로코드 구현 유사성이 복사본이 아닌 아키텍처가 요구하는 제약으로 인한 것임을 입증하여 승소했다.

인텔 386은 마이크로코드와 프로그래머블 로직 어레이의 내장 자체시험을 수행할 수 있으며, 자체 테스트 값은 EAX 레지스터에 저장된다. BIST 중 마이크로프로그램 카운터는 모든 ROM을 순회하는 데 재사용되며, 결과는 다중 입력 시그니처 레지스터(MISR) 및 선형 피드백 시프트 레지스터 네트워크를 통해 수집된다. 인텔 486 시작 시, 하드웨어 제어 BIST는 220 클럭 사이클 동안 실행되어 마이크로코드 ROM을 포함한 다양한 어레이를 확인하며, 그 후 제어는 레지스터 및 계산 단위의 추가 자체 테스트를 위해 마이크로코드로 전환된다. 인텔 486 마이크로코드 ROM은 250,000개의 트랜지스터를 가지고 있다.

AMD는 인텔의 286, 386 및 486 마이크로코드를 재사용하는 장기 계약을 맺고 있었다. 2004년 10월, 법원은 이 계약이 AMD가 인텔의 486 인서킷 에뮬레이션(ICE) 마이크로코드를 배포하는 것을 포함하지 않는다고 판결했다.

직접 접근 테스트
직접 접근 테스트(DAT)는 인텔 CPU에 포함된 디자인 포 테스트(DFT) 및 디버그 설계를 위한(DFD) 이니셔티브의 일부로서, 판매 전 개별 CPU의 전체 커버리지 테스트를 허용한다.

2020년 5월, Control Register Bus (CRBUS)에서 직접 읽는 스크립트(JTAG USB-A to USB-A 3.0 with Debugging Capabilities에서 "Red Unlock"을 악용한 후, D+, D− 및 Vcc 없음)을 사용하여 골드몬트 CPU의 Local Direct Access Test (LDAT) 포트에서 읽고 로드된 마이크로코드 및 패치 배열을 읽었다. 이러한 배열은 CPU가 특정 모드로 설정된 후에만 접근 가능하며, 오프셋 0x6a0을 통해 접근되는 5개의 배열로 구성된다.

 각주 

더 읽어보기

  "the first  in a REP swing operation loads the  Loop Counter with the number of iterations remaining after the unrolled iterations are executed. … a small number of iterations (e.g., seven), are sent during the time it takes for the Loop Counter in the MS to be loaded. This unrolled code is executed conditionally based on the value of (E)CX … remaining three iterations are turned into NOPS."

  "… control returns to the Micro-operation Sequence (MS) unit to issue further error correction Control micro-operations (Cuops). In order to simplify restart, the Cuops originating from the error-causing macroinstruction supplied by the translate programmable logic arrays (XLAT PLAs) are loaded into the Cuop registers, with their valid bits unasserted."
  "ADD, XOR, SUB, AND, and OR, which are implemented with one generic Cuop. Another group of instructions representable by only one  includes  and 



  "SYSENTER and SYSEXIT are assembly-language instructions that may be executed on an Intel architecture processor, such as the Pentium Pro processor … micro-operation is determined to be ready when its source fields have been filled with appropriate data … instruction decode unit comprises one or more translate (XLAT) programmable logic arrays (PLAs) that decode each instruction in to one or more micro-operations. … SYSENTER and SYSEXIT instructions are decoded in to micro-operations that perform the steps illustrated in FIGS. 5 and 6, respectively."




 외부 링크 
 uCodeDisasm — 파이썬으로 작성된 인텔 마이크로코드 디스어셈블러 (CRBUS에서), uop 이름들

분류:인텔 x86 마이크로프로세서
분류:인텔 마이크로아키텍처