CPU가 키보드, 마우스, 하드 디스크, 네트워크 카드와 같은 주변 장치(I/O 장치)와 데이터를 주고받는 방식
Memory Mapped IO, I/O Mapped I/O의 가장 근본적인 차이
- I/O 장치를 위한 주소 공간을 메모리와 공유하느냐 vs 별도로 분리하느냐
1. 메모리 맵 I/O (Memory Mapped I/O, MMIO)
I/O 장치를 메모리의 일부처럼 취급하는 방식
- I/O 장치의 레지스터(데이터를 쓰거나 읽는 통로)를 메모리 주소 공간의 특정 영역에 그대로 할당(매핑)
- 동작 방식: CPU 입장에서는 I/O 장치에 접근하는 것이 그냥 메모리의 특정 주소에 값을 읽고 쓰는 것과 동일. 따라서
MOV, LOAD, STORE와 같은 일반 메모리 접근 명령어를 사용하여 I/O 장치 제어
장점
- 단순한 명령어: I/O를 위한 별도 명령어가 필요 없는 단순한 CPU 설계 가능(주로 RISC 계열 CPU,
예: ARM, MIPS, RISC-V에서 선호)
- 프로그래밍 유연성: C언어에서 포인터를 사용하듯 메모리에 접근하는 모든 방식을 I/O 제어에도 동일하게 사용 가능
단점
- 메모리 주소 공간 잠식: I/O 장치에 할당된 주소 영역만큼 실제 메모리(RAM)가 사용할 수 있는 공간이 줄어듦
- 캐시 문제: I/O 장치의 상태는 실시간으로 변해야 하는데, CPU가 해당 주소의 값을 캐시(Cache)해버리면 이전의 값(Stale data)을 읽는 문제 발생 가능. 따라서 MMIO 영역은 반드시 캐시 비활성화(Non-cacheable)로 설정해야 함
2. I/O 맵 I/O (I/O Mapped I/O)
- 동작 방식: CPU는 메모리 주소 공간(예: 0번지~FFFF번지)과는 완전히 별개인 I/O 포트 주소 공간(예: 0번 포트~FF번 포트)을 가짐. 이 I/O 포트에 접근하기 위해서
IN, OUT과 같은 I/O 전용 특수 명령어 사용
장점
- 메모리 공간 절약: I/O 장치가 메모리 주소 공간을 전혀 차지하지 않으므로, 모든 메모리 주소를 RAM에 할당할 수 있음
- 명확한 구분: 메모리 접근과 I/O 접근이 명령어로 명확하게 분리되어 하드웨어적, 소프트웨어적으로 구분 용이
단점
- 전용 명령어 필요: I/O 접근을 위한 별도의 명령어 필요(주로 CISC 계열 CPU, 예: Intel x86에서 사용)
- 제한된 유연성:
IN, OUT과 같은 단순한 명령어만 사용 가능하므로, 메모리처럼 다양한 주소 지정 방식을 활용하기 어려움
| 구분 | 메모리 맵 I/O (MMIO) | I/O 맵 I/O (PMIO) |
|---|
| 주소 공간 | 메모리와 I/O가 동일한 주소 공간 공유 | 메모리와 I/O가 분리된 별도 주소 공간 사용 |
| 사용 명령어 | 일반 메모리 명령어 (예: MOV, LOAD, STORE) | I/O 전용 명령어 (예: IN, OUT) |
| 메모리 영향 | I/O 장치 매핑 영역만큼 메모리 공간 감소 | 메모리 공간에 영향 없음 |
| 유연성 | 높음 (다양한 메모리 접근 방식 사용 가능) | 낮음 (제한된 I/O 명령어만 사용) |
| 주요 아키텍처 | RISC (ARM, MIPS, RISC-V 등) | CISC (Intel x86 등) |
| 특징 | 캐시 관리(비활성화)가 필수적임 | 하드웨어적으로 주소 버스와 I/O 버스 분리 필요 |
실제 사용 예시
- 스마트폰, 임베디드 기기 (ARM CPU): 대부분 MMIO 방식 사용
- 현대 PC (Intel/AMD x86 CPU): 두 가지 방식 모두 사용
- 키보드, 시리얼 포트 등 오래된 레거시(Legacy) 장치들은 I/O 맵 I/O (PMIO) 사용
- 그래픽 카드(VRAM)나 고성능 네트워크 카드처럼 대량의 데이터를 빠르게 전송해야 하는 현대적인 장치들은 메모리 맵 I/O (MMIO) 사용 (DMA 전송 등에 훨씬 유리하기 때문)