본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

메모리 사상 입출력(Memory-mapped I/O, MMIO, 메모리 맵 입출력)은 CPU 주소 공간의 일부를 입출력 장치의 레지스터에 배정해, 메모리를 읽고 쓰는 명령으로 장치를 다루는 입출력 주소 지정 방식이다.

CPU가 장치와 데이터를 주고받으려면 장치의 데이터·상태·제어 레지스터를 가리킬 주소가 있어야 한다(입출력 인터페이스). 메모리 사상 입출력은 그 레지스터들에 메모리와 같은 주소 공간의 번지를 준다. 그 번지에 대한 읽기·쓰기는 기억장치가 아니라 장치로 간다. 리눅스 커널 문서는 CPU 주소 공간의 일부를 메모리 접근이 아닌 장치 접근으로 해석하는 이 방식을 가장 널리 지원되는 입출력 형태라고 설명한다. 드라이버는 장치의 물리 주소를 ioremap() 으로 커널 주소에 사상한 뒤 전용 접근 함수(readl, writel 등)로 읽고 쓴다.[1]

고립형 입출력과 구별하기

편집 원본 편집

반대 방식은 고립형 입출력(isolated I/O, 포트 사상 입출력)이다. 장치마다 메모리와 분리된 입출력 주소 공간(포트 번호)을 주고, IN·OUT 같은 전용 입출력 명령으로만 접근한다. x86 은 64K 개의 8비트 입출력 포트 공간을 따로 두는 고립형을 지원하면서, 장치를 물리 메모리 주소 공간에 두는 메모리 사상 입출력도 함께 쓸 수 있다.[2]

구분 메모리 사상 입출력 고립형 입출력
주소 공간 메모리와 같은 공간을 나누어 쓴다 메모리와 분리된 입출력 공간
명령어 일반 메모리 명령(LOAD, STORE, MOV) 전용 입출력 명령(IN, OUT)
장점 명령어 집합이 단순하다. 메모리용 연산·주소 지정 방식을 장치에도 그대로 쓴다 메모리 주소 공간을 줄이지 않는다. 명령만 보고 입출력임을 알 수 있다
단점 장치에 준 만큼 메모리로 쓸 주소가 줄어든다. 장치 레지스터를 캐시하지 않도록 따로 막아야 한다 별도 명령과 제어 신호가 필요하다
쓰는 곳 ARM, RISC-V 등 대부분의 프로세서, PCI 장치 레지스터 x86 의 I/O 포트

다른 입출력 기법과 구별하기

편집 원본 편집

메모리 사상 입출력은 장치를 어떻게 주소로 가리키는가의 문제이다. 데이터를 누가 옮기는가는 별개의 문제다.

  • 폴링(프로그램 제어 입출력) - CPU 가 장치 상태를 반복해서 확인하며 직접 옮긴다
  • 인터럽트 입출력 - 장치가 준비되면 CPU 에 알리고, CPU 가 옮긴다
  • DMA - DMA 제어기가 CPU 의 개입 없이 장치와 주기억장치 사이에서 블록을 옮기고, 끝나면 인터럽트로 알린다

그래서 메모리 사상 입출력을 쓰더라도 큰 데이터 블록을 CPU 가 한 워드씩 옮기면 CPU 와 버스가 그 일에 묶인다. CPU 개입 없이 기억장치와 장치 사이 전송을 맡기는 것은 DMA 이다.

  1. ↑ 「Bus-Independent Device Accesses」, The Linux Kernel documentation, https://docs.kernel.org/driver-api/device-io.html, 확인일: 2026-11-04.
  2. ↑ 「Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1」, 19장 「Input/Output」, Intel, https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html, 확인일: 2026-11-04.