메모리 매핑 I/O(Memory-Mapped I/O, MMIO)는 장치 레지스터와 파일을 가상 주소 공간에 직접 매핑해 일반 메모리 접근처럼 I/O를 수행하는 기법이다. 포트 I/O 방식보다 빠르고 프로그래밍이 쉽다.
파일 메모리 매핑 (mmap)
c
# include <sys/mman.h>
// 파일을 가상 주소에 매핑
int fd = open("data.bin", O_RDWR);
size_t size = 1024 * 1024; // 1MB
void *addr = mmap(NULL, size,
PROT_READ | PROT_WRITE,
MAP_SHARED, // MAP_PRIVATE: COW
fd, 0); // 오프셋
// 일반 메모리처럼 접근
int *data = (int *)addr;
data[0] = 42; // 파일에 직접 반영 (MAP_SHARED)
// 매핑 해제
munmap(addr, size);
하드웨어 레지스터 매핑
c
// 임베디드/드라이버 프로그래밍
volatile uint32_t *gpio = (uint32_t *)mmap(
NULL, 4096, PROT_READ|PROT_WRITE,
MAP_SHARED, mem_fd, 0x3F200000 // GPIO 기본 주소
);
gpio[7] = 1 << 4; // GPIO 핀 제어
포트 I/O vs MMIO
| 포트 I/O | MMIO |
|---|
| 주소 공간 | 별도 I/O 주소 공간 | 메모리 주소 공간 공유 |
| 명령어 | in/out (x86 특수) | 일반 load/store |
| 속도 | 느림 | 빠름 |
| 현대 사용 | 레거시 | 대부분 장치 |
관련 개념