Memory Mapped I/O와 Port-Mapped I/O의 주소 공간 설계

Memory Mapped I/O와 Port-Mapped I/O의 주소 공간, 명령어, 하드웨어 구성을 비교하고 ARM·x86 시스템의 선택 방식을 정리한다.

2026-08-14 · 최초 발행 2025-12-28

CPU가 장치를 주소로 선택하는 방식

CPU와 주기억장치 사이의 데이터 전송에는 고속 버스가 쓰인다. 반면 주기억장치와 2차 저장소가 데이터를 주고받으려면 I/O 인터페이스가 필요하며, 이 과정에는 DMA(Direct Memory Access) 컨트롤러, 인터럽트 기반 처리, 버퍼링과 캐싱이 함께 사용될 수 있다.

I/O 주소지정 방식은 CPU가 장치를 식별하고 제어하는 기준을 정한다. 메모리 주소와 I/O 주소를 하나로 관리할지 분리할지에 따라 명령어 집합, 프로그래밍 모델, 하드웨어 복잡도와 성능의 트레이드오프가 달라진다.

메모리 주소 공간에 장치를 배치하는 MMIO

Memory Mapped I/O는 주기억장치 주소 공간 일부를 I/O 장치에 할당하는 방식이다. 메모리와 I/O 장치는 같은 주소 버스를 공유하며, 장치 레지스터는 특정 메모리 주소에 매핑된다. 따라서 메모리에 읽기·쓰기를 수행하는 명령어로 장치를 제어할 수 있다.

주소 공간이 통합되므로 별도의 I/O 명령어가 필요 없다. 메모리 명령어가 제공하는 주소지정 모드, 포인터 연산, 컴파일러 최적화를 I/O 접근에도 활용할 수 있다. 베이스 레지스터와 오프셋, 사전·사후 인덱싱, 레지스터 간접 주소지정도 같은 모델 안에서 다룬다.

ARM 프로세서 계열, MIPS 아키텍처, 일부 PowerPC, 일반적인 RISC 아키텍처와 SoC 설계가 이 방식을 채택한다. 임베디드 시스템과 모바일 디바이스, 네트워크 장비에서 페리페럴을 통합하기에 적합하다.

명령어 집합 크기를 줄이고 복잡한 주소지정 모드를 활용할 수 있으며, 프로그래밍 모델도 일관된다. 비트 단위 I/O 제어가 쉽고 캐시 메커니즘도 적용할 수 있지만 비캐시 영역 설정이 필요하다. 반대로 메모리 주소 공간 일부가 I/O에 할당되므로 실제 메모리 용량이 줄고, 메모리 보호와 페이지 테이블 관리가 복잡해질 수 있다. 캐시 일관성 문제와 디버깅 시 메모리·I/O 구분의 어려움도 고려 대상이다.

주소 범위 A주소 범위 B주소 범위 C주소 공간0x0000 - 0x7FFF: 메모리0x8000 - 0x8FFF: I/O 장치 10x9000 - 0x9FFF: I/O 장치 2CPU통합 주소 버스주소 디코더주기억장치(RAM)I/O 장치 1(레지스터)I/O 장치 2(레지스터)

포트 주소 공간을 따로 두는 방식

I/O Mapped I/O, 또는 Port-Mapped I/O는 I/O 인터페이스 주소를 메모리 주소와 물리적으로 구별한다. 독립된 I/O 주소 공간을 유지하고, 전용 제어 신호와 I/O 명령어로 장치에 접근한다. 장치는 포트 번호로 식별된다.

이 방식에서는 IN, OUT 같은 특수 명령어가 필요하다. 메모리 읽기·쓰기 신호와 I/O 읽기·쓰기 신호도 분리되므로 메모리와 I/O의 경계가 명확하며, I/O 접근 권한을 제어하기에도 유리하다.

x86 계열의 Intel·AMD CPU, IBM PC 호환 시스템, 일부 CISC 아키텍처와 하위 호환성을 유지해야 하는 레거시 시스템에서 사용된다. 메모리 주소 공간을 온전히 사용할 수 있고, I/O 특화 명령어 및 단순한 디코딩 로직을 사용할 수 있다. 16비트 포트 주소 등 작은 I/O 주소 공간으로도 충분하다.

대신 별도 I/O 명령어 때문에 명령어 집합이 늘고, 주소지정 모드는 제한된다. 프로그래밍과 컴파일러 최적화에도 제약이 생기며, I/O 제어 신호를 위한 추가 핀이 필요하다.

분리된 주소 공간메모리 공간: 32비트 주소I/O 공간: 16비트 포트CPU메모리 주소 버스I/O 주소 버스제어 신호(MEMR/MEMW/IOR/IOW)주기억장치(RAM)주소:0x00000000-0xFFFFFFFFI/O 디코더I/O 포트 1포트: 0x3F8I/O 포트 2포트: 0x2F8

같은 장치 접근이 다른 명령어로 표현되는 지점

MMIO에서 I/O 레지스터 읽기는 LOAD 명령어로 수행한다.

LDR R0, [0x8000]  ; 주소 0x8000의 I/O 레지스터 값을 R0에 로드

쓰기도 STORE 명령어를 사용한다.

STR R1, [0x8004]  ; R1의 값을 주소 0x8004의 I/O 레지스터에 저장

Port-Mapped I/O에서는 포트 읽기에 IN 명령어를 사용한다.

IN AL, 0x60       ; 포트 0x60에서 1바이트를 AL 레지스터로 읽기
IN AX, DX         ; DX가 가리키는 포트에서 2바이트를 AX로 읽기

포트 쓰기는 OUT 명령어가 담당한다.

OUT 0x64, AL      ; AL 레지스터의 값을 포트 0x64에 쓰기
OUT DX, AX        ; AX의 값을 DX가 가리키는 포트에 쓰기

MMIO는 메모리 접근 명령어 전체와 복잡한 주소지정 모드를 활용할 수 있다. Port-Mapped I/O는 직접 포트 주소인 8비트 또는 16비트 방식과 DX 레지스터를 이용한 간접 접근으로 범위가 제한되지만, 특권 명령어로 보호할 수 있다.

I/O Mapped I/OMemory Mapped I/OLOAD R0, [addr]메모리 읽기 명령어STORE R1, [addr]메모리 쓰기 명령어IN AL, port전용 입력 명령어OUT port, AL전용 출력 명령어장점: 모든 주소지정 모드 활용장점: 명확한 I/O 구분

버스와 제어 신호가 달라지는 구조

MMIO는 메모리와 I/O 장치가 단일 주소 버스를 공유한다. READ와 WRITE 같은 기존 메모리 제어 신호를 재사용하고, 주소 디코더가 주소 범위에 따라 메모리 또는 I/O 장치를 선택한다. 특정 주소 범위에서 I/O 장치를 활성화하는 칩 선택(Chip Select)도 이 구조에 포함된다. 기존 메모리 버스 인프라를 쓰므로 추가 하드웨어를 최소화할 수 있다.

Port-Mapped I/O는 메모리 버스와 I/O 버스를 분리하거나 다중화한다. MEMR(Memory Read), MEMW(Memory Write), IOR(I/O Read), IOW(I/O Write) 같은 I/O 전용 제어 신호와 M/IO 선택 신호가 메모리 접근과 I/O 접근을 구분한다. I/O 주소 디코더도 독립적으로 구성하며, 제어 신호용 추가 핀이 필요하다.

I/O Mapped I/O 하드웨어CPU주소 버스I/O 주소 버스제어 신호(MEMR/MEMW/IOR/IOW)메모리I/O 디코더I/O 장치Memory Mapped I/O 하드웨어CPU주소 버스(단일)제어 신호(READ/WRITE)주소 디코더메모리I/O 장치

ARM과 x86에서의 공존 방식

ARM 프로세서에서는 모든 페리페럴을 메모리 주소 공간에 매핑한다. GPIO, UART, SPI, I2C 같은 표준 인터페이스는 데이터시트에 명시된 베이스 주소를 기반으로 레지스터 수준에서 접근하고 비트를 조작한다. 임베디드 리눅스 커널에서는 ioremap() 함수를 활용한다.

x86에는 0x0000 ~ 0xFFFF 포트 주소 공간이 있다. 키보드는 0x60, 타이머는 0x40, DMA는 0x00-0x0F의 레거시 포트를 사용하며, PCI 설정 공간 접근에는 0xCF8과 0xCFC 포트가 쓰인다. 동시에 현대 시스템은 PCI Express BAR를 통한 MMIO로 고속 장치에 접근한다.

따라서 x86에서도 대용량 I/O와 PCIe 장치는 주로 MMIO를 기반으로 하며, Port-Mapped I/O는 레거시 호환성을 위해 병행된다. 이는 성능과 호환성 사이에서 혼합 방식을 선택하는 구조다.

아키텍처 요구에 맞춰 고르는 기준

RISC 아키텍처, 통합된 프로그래밍 모델, 임베디드 시스템과 SoC 설계, 명령어 집합 단순화, 컴파일러 최적화가 중요한 환경에서는 MMIO가 맞는다.

CISC 아키텍처, 레거시 호환성, 메모리 주소 공간 보존, 명확한 메모리-I/O 분리, 보안 및 권한 제어가 우선인 환경에서는 Port-Mapped I/O를 선택할 이유가 있다.

메모리 맵드 I/O포트 맵드 I/O컴퓨터구조운영체제x86ARM