MIPS 란?
MIPS 아키텍처: 심층 분석
MIPS(Microprocessor without Interlocked Pipeline Stages)는 1980년대 초 스탠포드 대학교에서 존 헤네시(John Hennessy) 교수가 이끄는 팀에 의해 개발되었으며, 이후 MIPS Technologies에 의해 상용화되었습니다. MIPS는 RISC 철학의 대표적인 예시로, 단순하고 규칙적인 명령어 집합과 효율적인 파이프라이닝을 통해 고성능을 달성하는 데 중점을 둡니다.
1. RISC 철학의 구현
MIPS는 RISC(Reduced Instruction Set Computer)의 핵심 원칙들을 충실히 따릅니다.
축소된 명령어 집합: CISC(Complex Instruction Set Computer)와 달리, MIPS는 소수의 단순하고 고정된 길이의 명령어(32비트)를 사용합니다. 각 명령어는 한 사이클 내에 실행될 수 있도록 설계되어 파이프라인 효율을 극대화합니다.
로드/스토어 아키텍처: 메모리 접근은 오직
load
(메모리에서 레지스터로) 및store
(레지스터에서 메모리로) 명령어만을 통해 이루어집니다. ALU 연산은 레지스터 간에만 수행됩니다. 이는 데이터 흐름을 명확하게 하고, 파이프라인에서 메모리 접근 단계를 분리하여 효율성을 높입니다.대용량 레지스터 파일: 범용 레지스터가 많을수록 메모리 접근 횟수를 줄여 성능을 향상시킬 수 있습니다. MIPS는 32개의 32비트 범용 레지스터(
$0
부터$31
)를 제공하며,$0
는 항상 0 값을 가집니다.하드웨어 제어 장치: CISC의 복잡한 마이크로코드 방식과 달리, MIPS는 대부분의 명령어 제어를 하드웨어 논리로 구현하여 더 빠른 실행 속도를 제공합니다.
컴파일러 친화적: 단순하고 규칙적인 명령어 집합은 컴파일러가 효율적인 기계어 코드를 생성하기 용이하게 합니다.
2. MIPS의 명령어 형식 (Instruction Formats)
MIPS는 주로 세 가지 고정된 길이(32비트)의 명령어 형식을 사용합니다. 이는 명령어 디코딩을 단순화하고 파이프라인 처리를 용이하게 합니다.
R-타입 (Register Type): 레지스터 간 연산에 사용됩니다.
Opcode (6비트)
|Rs (5비트)
|Rt (5비트)
|Rd (5비트)
|Shamt (5비트)
|Funct (6비트)
Opcode
: 명령어의 기본 연산을 나타냅니다.Rs
,Rt
: 첫 번째/두 번째 소스 레지스터.Rd
: 목적지 레지스터.Shamt
: 시프트 명령어의 시프트 양.Funct
: Opcode가 0일 때, 실제 연산을 지정하는 함수 코드 (예:add
,sub
,and
).예시:
add $rd, $rs, $rt
(Rd = Rs + Rt)
I-타입 (Immediate Type): 상수(immediate) 값이나 메모리 주소 오프셋을 포함하는 명령어에 사용됩니다.
Opcode (6비트)
|Rs (5비트)
|Rt (5비트)
|Immediate (16비트)
Immediate
: 16비트 부호 확장(sign-extended) 상수 또는 오프셋.예시:
addi $rt, $rs, immediate
(Rt = Rs + immediate),lw $rt, offset($rs)
(Rt = Memory[Rs + offset])
J-타입 (Jump Type): 점프 명령어에 사용됩니다.
Opcode (6비트)
|Address (26비트)
Address
: 26비트 점프 대상 주소. 실제 주소는 이 값에 4를 곱하고 PC의 상위 비트와 결합하여 생성됩니다.예시:
j address
(PC = address)
이러한 고정된 형식은 명령어 인출(Fetch) 및 디코딩(Decode) 단계를 단순화하여 파이프라인 성능을 향상시키는 데 기여합니다.
3. 파이프라인 (Pipelining)
MIPS는 파이프라인 아키텍처의 교과서적인 예시로, 대부분의 MIPS 구현은 5단계 파이프라인을 사용합니다.
IF (Instruction Fetch): 메모리에서 명령어를 가져옵니다.
ID (Instruction Decode): 명령어를 디코딩하고 레지스터 값을 읽어옵니다.
EX (Execute): ALU 연산을 수행합니다.
MEM (Memory Access): 메모리 로드/스토어 연산을 수행합니다.
WB (Write Back): 연산 결과를 레지스터 파일에 다시 씁니다.
해저드 (Hazards) 및 해결책:
파이프라인은 명령어들을 동시에 처리하여 처리량을 높이지만, 해저드(hazards)라는 문제에 직면할 수 있습니다.
구조적 해저드 (Structural Hazards): 하드웨어 자원(예: 메모리)이 동시에 두 명령어에 의해 요청될 때 발생합니다. MIPS는 별도의 명령어/데이터 캐시를 사용하여 이 문제를 해결합니다.
데이터 해저드 (Data Hazards): 명령어 실행에 필요한 데이터가 아직 준비되지 않았을 때 발생합니다.
포워딩 (Forwarding/Bypassing): 이전 단계에서 생성된 ALU 결과를 다음 단계로 직접 전달하여 스톨(stall)을 줄입니다.
스톨 (Stalling): 데이터가 준비될 때까지 파이프라인을 잠시 멈춥니다.
제어 해저드 (Control Hazards): 분기 명령어(branch)의 목적지를 결정하기 전에 다음 명령어를 인출하기 시작할 때 발생합니다.
분기 예측 (Branch Prediction): 분기의 다음 경로를 예측하고, 예측이 틀리면 파이프라인을 플러시(flush)합니다.
지연 슬롯 (Delay Slot): MIPS I/II 아키텍처의 특징으로, 분기 명령어 바로 다음의 명령어가 항상 실행됩니다. 이 슬롯에 유용한 명령어를 채워 넣어 파이프라인 스톨을 피합니다 (최신 MIPS 아키텍처에서는 지연 슬롯이 사라지거나 선택 사항이 됨).
4. 메모리 구성
바이트 주소 지정 (Byte-addressable): 메모리의 각 바이트는 고유한 주소를 가집니다.
워드 정렬 (Word alignment): 32비트 워드(4바이트)는 4의 배수 주소에 저장되어야 합니다. 그렇지 않으면 예외(주소 오류)가 발생합니다.
빅 엔디안 (Big-endian) 또는 리틀 엔디안 (Little-endian): MIPS는 두 가지 모두 지원할 수 있도록 설계되었으며, 구현에 따라 선택됩니다. (빅 엔디안: 최상위 바이트가 가장 낮은 주소에, 리틀 엔디안: 최하위 바이트가 가장 낮은 주소에 저장)
5. MIPS의 예외 (Exceptions) 및 인터럽트 (Interrupts)
제가 이전에 상세히 설명드린 내용이지만, MIPS 아키텍처의 중요한 구성 요소이므로 다시 한번 간략하게 강조합니다.
정의: 프로그램 실행을 방해하는 예상치 못한 이벤트.
유형: 산술 오버플로우, 정의되지 않은 명령어, 주소 오류, TLB 미스 (내부 예외) 및 I/O 장치 요청 (인터럽트, 외부 예외) 등이 있습니다.
CP0 (System Control Coprocessor): 예외 처리를 위한 특수 레지스터(EPC, Cause, Status, BadVAddr 등)를 포함하여 예외의 발생, 유형 기록, 처리 루틴으로의 점프 및 복귀를 제어합니다.
파이프라인에서의 처리: 예외는 제어 해저드로 간주되며, 예외 발생 시 해당 명령어 이후의 파이프라인은 플러시되고, 정확한 예외 발생 지점까지의 명령어는 완료됩니다. 이후 EPC와 Cause 레지스터가 설정되고 예외 핸들러로 제어가 전달됩니다.
6. MIPS 명령어 집합의 특징
다양한 연산: 산술 (add, sub, mul, div), 논리 (and, or, xor, nor), 시프트 (sll, srl, sra), 로드/스토어 (lw, sw, lb, sb 등), 분기 (beq, bne 등), 점프 (j, jal, jr) 등 다양한 명령어를 제공합니다.
의사 명령어 (Pseudo-instructions): 어셈블리어를 작성할 때 프로그래머의 편의를 위해 제공되는 명령어들입니다. 실제로는 하나 이상의 기본 MIPS 명령어로 변환됩니다 (예:
move $t1, $t2
는add $t1, $t2, $zero
로 변환될 수 있음).
7. MIPS 아키텍처의 변형 (Variants)
MIPS 아키텍처는 시간이 지나면서 여러 버전으로 발전했습니다.
MIPS I, II, III, IV, V: 초기 32비트 아키텍처부터 64비트, 부동소수점 처리 기능 등을 추가하며 발전했습니다.
MIPS32/MIPS64: 현재 주로 사용되는 32비트 및 64비트 아키텍처의 표준입니다.
microMIPS: 코드 밀도(code density)를 향상시키기 위해 16비트 명령어와 32비트 명령어를 혼합하여 사용하는 변형입니다.
8. MIPS의 활용 및 중요성
과거에는 MIPS 프로세서가 SGI 워크스테이션, Cisco 라우터, Sony PlayStation (PS1, PS2), Nintendo 64 등 다양한 임베디드 시스템, 네트워크 장비, 게임 콘솔 등에서 널리 사용되었습니다. ARM 아키텍처의 부상으로 인해 시장 점유율은 감소했지만, 컴퓨터 아키텍처 교육 분야에서는 여전히 RISC 원칙을 이해하기 위한 가장 중요한 아키텍처 중 하나로 광범위하게 연구되고 가르쳐지고 있습니다. 단순하고 규칙적인 구조 덕분에 학생들이 파이프라인, 캐시, 메모리 관리, 예외 처리 등 컴퓨터 시스템의 핵심 개념을 학습하기에 매우 적합하기 때문입니다.
MIPS는 컴퓨터 아키텍처의 기본 원리를 이해하는 데 있어 '교과서'와 같은 역할을 하는 중요한 아키텍처입니다. 그 단순하고 효율적인 설계는 현대의 고성능 프로세서에도 많은 영향을 미쳤습니다.