메모리 맵 입출력
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
메모리 맵 입출력은 CPU가 메모리와 입출력 장치를 동일한 주소 공간에 할당하여, 메모리 접근 명령으로 입출력 장치를 제어하는 방식이다. 이는 CPU 내부 로직을 간소화하고, RISC 아키텍처 및 임베디드 시스템에 유리하며, CPU의 모든 어드레싱 모드를 I/O와 메모리에 사용할 수 있다는 장점이 있다. 메모리 맵 입출력과 대조되는 포트 맵 입출력 방식은 입출력을 위한 별도의 주소 공간과 명령어를 사용하며, CPU의 주소 공간 제약이 있는 경우에 유용하다. 주소 디코딩 방식에는 완전 디코딩, 불완전 디코딩, 선형 디코딩이 있으며, 캐시 메모리를 사용하는 시스템에서는 메모리 맵 입출력 시 캐시 무효화가 필요하고, 입출력 장치 레지스터 접근 순서에 유의해야 한다.
더 읽어볼만한 페이지
메모리 맵 입출력 | |
---|---|
기본 정보 | |
유형 | 컴퓨터 구조 개념 |
특징 | 입출력 장치를 메모리 주소 공간에 할당 |
관련 개념 | 포트 맵 입출력 |
메모리 맵 입출력 (MMIO) | |
정의 | CPU가 메모리 주소를 사용하여 입출력 장치와 통신하는 방식 |
작동 방식 | CPU는 특정 메모리 주소에 접근하여 입출력 장치를 제어 입출력 장치는 해당 메모리 주소에 연결되어 CPU와 데이터 교환 |
장점 | CPU 명령어 세트를 변경할 필요가 없음 메모리 접근 명령어와 동일한 명령어를 사용하여 입출력 장치 제어 |
단점 | 메모리 주소 공간의 일부를 입출력 장치에 할당해야 함 실제 메모리 용량 감소 |
사용 예시 | 그래픽 카드 사운드 카드 네트워크 카드 |
포트 맵 입출력 (PMIO) | |
정의 | CPU가 특수한 입출력 포트 주소를 사용하여 입출력 장치와 통신하는 방식 |
작동 방식 | CPU는 IN 및 OUT과 같은 특수한 명령어를 사용하여 입출력 포트에 접근 입출력 장치는 해당 포트 주소에 연결되어 CPU와 데이터 교환 |
장점 | 메모리 주소 공간을 침범하지 않음 입출력 장치를 위한 별도의 주소 공간 제공 |
단점 | CPU 명령어 세트에 특수한 입출력 명령어가 필요함 메모리 접근 명령어와 다른 명령어를 사용해야 함 |
사용 예시 | IBM PC 호환기종의 레거시 장치 (예: COM 포트, LPT 포트) |
비교 | |
주소 공간 | MMIO: 메모리 주소 공간 PMIO: 입출력 포트 주소 공간 |
명령어 | MMIO: 메모리 접근 명령어 PMIO: IN/OUT 명령어 |
메모리 사용량 | MMIO: 메모리 사용 PMIO: 메모리 미사용 |
복잡성 | MMIO: 비교적 간단 PMIO: 특수 명령어 필요 |
추가 정보 | |
운영체제 | 두 방식 모두 지원 가능 |
장치 드라이버 | 각 방식에 맞는 드라이버 필요 |
2. 입출력 방식의 종류와 원리
컴퓨터 시스템에서 중앙 처리 장치(CPU)와 주변 장치(입출력 장치) 간의 통신은 크게 두 가지 방식으로 이루어진다. 바로 메모리 맵 입출력(Memory-mapped I/O) 방식과 포트 맵 입출력(Port-mapped I/O, I/O 맵 입출력[2][3], 프로그램드 I/O[4]) 방식이다.
메모리 맵 입출력은 CPU가 메모리 주소 공간의 일부를 입출력 장치에 할당하여, 일반적인 메모리 접근 명령(예: 읽기, 쓰기)을 통해 입출력 장치를 제어하는 방식이다. 반면 포트 맵 입출력은 입출력을 위한 특별한 CPU 명령을 사용한다. 예를 들어, 인텔의 x86 CPU는 입출력 전용 IN 명령과 OUT 명령이 있어, 입출력 장치의 1바이트(8비트) 또는 16비트 읽기/쓰기를 수행한다.[5]
메모리 맵 입출력 방식은 별도의 입출력 명령어가 필요 없어 CPU 설계를 단순화하고, 더 빠르고 저렴하며 전력 소비가 적은 CPU를 만들 수 있게 한다. 특히 RISC 아키텍처와 임베디드 시스템에서 유리하다. 그러나 주소 및 데이터 버스를 많이 사용하게 되어, 메인 메모리에 접근하는 것보다 매핑된 장치에 접근하는 것이 더 느릴 수 있다.
포트 맵 입출력 방식은 CPU가 입출력 장치를 제어하기 위해 별도의 주소 공간과 특수한 입출력 명령어(예: IN, OUT)를 사용하는 방식이다. 이 방식을 사용하면 CPU가 제한된 어드레싱 능력을 가질 때 메모리 주소 공간 전체를 활용할 수 있다는 장점이 있다. 또한, 어셈블리어 코드에서 입출력이 언제 수행되는지 쉽게 파악할 수 있다.
16비트 프로세서가 사용이 중단되고 32비트 및 64비트 프로세서로 일반화되면서, 입출력 장치를 위해 메모리 주소 공간 범위를 예약하는 문제는 덜 심각해졌다. 따라서 현대의 많은 시스템에서는 메모리 맵 입출력의 장점을 활용하는 것이 더 실용적이 되었다.
하지만 메모리 맵 입출력은 주소와 데이터 버스를 많이 사용하게 되므로, 보통 메인 메모리에 접근하는 것보다 매핑된 장치에 접근하는 것이 더 느리다. 반면, 포트 맵 입출력은 입출력용으로 할당된 버스를 사용할 경우 속도 저하가 발생하지 않는다.
2. 1. 메모리 맵 입출력 (Memory-mapped I/O)
메모리 맵 입출력(Memory-mapped I/O)은 CPU가 메모리 주소 공간의 일부를 입출력 장치에 할당하여, 일반적인 메모리 접근 명령(예: 읽기, 쓰기)을 통해 입출력 장치를 제어하는 방식이다. CPU는 별도의 입출력 명령 없이 메모리 접근 명령어를 사용하여 입출력 장치에 접근하며, 메모리와 입출력 장치가 동일한 주소 공간을 공유한다.8비트 마이크로프로세서 기반 시스템을 예로 들어 설명한다. 이 CPU가 16비트 주소 라인을 가지고 있어 64 키비바이트(KiB)의 메모리를 사용할 수 있다고 가정한다. 이 시스템에서 주소 공간의 처음 32 KiB는 램(RAM)에, 다음 16 KiB는 롬(ROM)에 할당하고, 나머지는 다양한 장치(타이머, 카운터, 비디오 칩, 사운드 장치 등)에 할당할 수 있다.
각 장치는 자신에게 할당된 주소에만 반응하고, 다른 주소는 무시한다. 이러한 동작은 주소 디코딩 회로를 통해 이루어지며, 이를 통해 시스템의 메모리 맵이 구성된다.
다음은 예시 시스템의 메모리 맵이다.
장치 | 주소 범위 (16진법) | 크기 |
---|---|---|
램 | 0000 - 7FFF | 32 KiB |
일반 목적 입출력 | 8000 - 80FF | 256 바이트 |
사운드 컨트롤러 | 9000 - 90FF | 256 바이트 |
비디오 컨트롤러/텍스트 매핑 디스플레이 램 | A000 - A7FF | 2 KiB |
롬 | C000 - FFFF | 16 KiB |
위 표에서 볼 수 있듯이, 메모리 맵에는 빈 공간이 있을 수 있으며, 이는 일반적인 현상이다.
예를 들어, 비디오 컨트롤러의 네 번째 레지스터가 화면 배경색을 지정하는 데 사용된다면, CPU는 A003이라는 메모리 위치에 값을 기록하여 배경색을 변경할 수 있다. 마찬가지로, 비디오 컨트롤러의 램 영역에 특정 문자를 기록하여 화면에 텍스트를 표시할 수도 있다. 이러한 방식은 비트맵 디스플레이가 보편화되기 전까지 널리 사용되었다. (텍스트 사용자 인터페이스 참조)
메모리 맵 입출력은 CPU가 일반 메모리 명령어를 사용하여 장치를 제어할 수 있게 해주므로, 별도의 입출력 명령어가 필요하지 않다. 이는 CPU 설계를 단순화하고, 더 빠르고 저렴하며 전력 소비가 적은 CPU를 만들 수 있게 한다. 특히 RISC 아키텍처와 임베디드 시스템에서 유리하다. 또한, CPU의 모든 어드레싱 모드를 입출력에도 사용할 수 있다는 장점이 있다. 예를 들어, ALU 연산을 메모리 피연산자에 직접 수행하는 명령어를 I/O 장치 레지스터와 함께 사용할 수 있다.
하지만 메모리 맵 입출력은 주소 및 데이터 버스를 많이 사용하게 되어, 메인 메모리에 접근하는 것보다 매핑된 장치에 접근하는 것이 더 느릴 수 있다.
2. 2. 포트 맵 입출력 (Port-mapped I/O)
포트 맵 입출력(Port-mapped I/O, I/O 맵 입출력[2][3] 또는 프로그램드 I/O[4])은 CPU가 입출력 장치를 제어하기 위해 별도의 주소 공간과 특수한 입출력 명령어(예: IN, OUT)를 사용하는 방식이다. 입출력 장치는 주 기억 장치와 분리된 주소 공간에 있으며, CPU는 특수한 입출력 명령어를 통해서만 입출력 장치에 접근할 수 있다.예를 들어, 인텔의 x86 CPU는 IN, OUT 명령어를 사용하여 입출력 장치의 1바이트(8비트) 또는 16비트[5] 데이터를 읽거나 쓸 수 있다. 이때 16비트 입출력 장치는 짝수 주소에 배치해야 한다.[5] 입출력 장치는 CPU의 특수한 I/O 핀이나 입출력 버스의 핀을 통해 연결된다. 특수한 I/O 핀이 있는 경우, 일반 데이터 버스에 입출력 장치가 연결되며, I/O 핀이 활성화될 때 주소 버스에 출력된 포트 번호를 해독하는 회로에 의해 해당 입출력 장치의 레지스터가 데이터 버스와 통신하게 된다.
인텔 8086 CPU는 최대 모드에서 I/O 핀으로도 사용되는 상태 신호 , , 를 가지고 있다. =0, =0, =1이면 I/O 읽기, =0, =1, =0이면 I/O 쓰기를 나타내며, 이는 버스 컨트롤러 Intel 8288에 대한 제어 입력 신호로 사용된다.[5]
포트 맵 입출력을 사용하면, CPU가 제한된 어드레싱 능력을 가질 때 메모리 주소 공간 전체를 활용할 수 있다는 장점이 있다. 또한, 어셈블리어 코드에서 입출력이 언제 수행되는지 쉽게 파악할 수 있다. 반면, 포트 맵 입출력은 입출력용으로 할당된 버스를 사용할 경우 속도가 느려지지 않지만, 주소와 데이터 버스를 많이 사용할 경우 메모리 맵 입출력에 비해 메인 메모리에 접근하는 속도가 느려질 수 있다.
3. 각 입출력 방식의 장단점 비교
메모리 맵 입출력(Memory-mapped I/O)과 포트 맵 입출력(Port-mapped I/O, I/O 맵 입출력, 프로그램드 I/O라고도 함)은 CPU가 주변 장치와 통신하는 두 가지 방식이다. 각 방식은 장단점을 가지며, 특정 상황에서 더 유리할 수 있다.
포트 맵 입출력의 장점
- 주소 공간 절약: 어드레싱 능력이 제한된 CPU에서 유용하다. 입출력 접근과 메모리 접근이 분리되어 메모리 주소 공간 전체를 활용할 수 있다.
- 명확성: 어셈블리어 소스 코드에서 입출력 수행을 쉽게 파악할 수 있다. 입출력 전용 명령어를 사용하기 때문이다.
메모리 맵 입출력의 장점
- CPU 설계 단순화: CPU 내부 로직이 덜 필요하여 더 저렴하고, 빠르고, 쉽게 만들 수 있다. 이는 RISC 아키텍처와 임베디드 시스템에서 특히 유리하다.
- 어드레싱 모드 활용: 일반적인 메모리 명령어를 사용하므로, CPU의 모든 어드레싱 모드를 입출력에도 사용할 수 있다. ALU 연산을 I/O 장치 레지스터에 직접 수행할 수 있다.
- 주소 공간 문제 완화: 16비트 CPU에서 32비트, 64비트 CPU로 발전하면서, 입출력을 위한 메모리 주소 공간 확보가 더 이상 큰 문제가 되지 않는다.
x86 아키텍처에서의 메모리 맵 입출력 선호IA-32 및 x86-64 기반 아키텍처에서는 메모리 맵 입출력이 선호된다. 그 이유는 다음과 같다.
- 레지스터 사용 제한: 포트 기반 입출력 명령어는 EAX, AX, AL 레지스터로만 데이터를 이동할 수 있다.
- 64비트 전송 미지원: AMD는 x86-64 아키텍처에서 64비트 포트 입출력을 지원하지 않는다.
따라서 메모리 맵 입출력은 더 적은 명령어를 사용하고 더 빠르게 실행될 수 있다.
결론메모리 맵 입출력은 CPU 설계 단순화, 어드레싱 모드 활용 등의 장점으로 인해 현대 시스템에서 널리 사용된다. 그러나 주소 공간이 제한적이거나 어셈블리 프로그래밍을 하는 경우에는 포트 맵 입출력이 유리할 수 있다.
4. 주소 디코딩
8비트 마이크로프로세서로 구현된 간단한 시스템을 예로 들어보자. 이 CPU는 16비트 주소 라인을 가지고 있어, 64 키비바이트(KiB)의 메모리에 접근할 수 있다. 이러한 시스템에서 주소 공간은 다음과 같이 할당될 수 있다.
장치 | 주소 범위 (16진법) | 크기 |
---|---|---|
램 (RAM) | 0000 - 7FFF | 32 KiB |
일반 목적 입출력 | 8000 - 80FF | 256 바이트 |
사운드 컨트롤러 | 9000 - 90FF | 256 바이트 |
비디오 컨트롤러/텍스트 매핑 디스플레이 램 | A000 - A7FF | 2 KiB |
롬 (ROM) | C000 - FFFF | 16 KiB |
위 표와 같이 처음 32 KiB는 램에, 다음 16 KiB는 롬에 할당되고, 나머지는 타이머, 카운터, 디스플레이 비디오 칩, 소리 구현 장치와 같은 다양한 장치들에 할당된다. 메모리 맵에 빈 공간들이 존재하는데, 이는 흔한 경우이다.
연결된 장치들은 자신에게 할당된 주소에만 반응하고, 다른 주소들은 무시한다. 이러한 역할을 하는 것이 주소 디코딩 회로이며, 이를 통해 시스템의 메모리 맵이 만들어진다.
예를 들어, 비디오 컨트롤러의 네 번째 레지스터가 화면의 바탕색을 지정한다고 할 때, CPU는 A003이라는 메모리 위치에 값을 기록하여 배경색을 지정할 수 있다. 이와 같은 방법으로 비디오 컨트롤러의 특별한 램 공간에 문자를 써서 화면에 글자를 표현할 수 있었다. 비트맵 디스플레이를 사용할 수 있도록 만든 저렴한 램이 나오기 전까지는, 이러한 문자 셀 방식을 이용해서 표시하는 것이 일반적이었다. (텍스트 사용자 인터페이스 참조)
주소 디코딩은 장치가 주소를 완전히 디코딩할 수도 있고, 불완전하게 디코딩할 수도 있다.
4. 1. 완전 주소 디코딩 (Complete Decoding)
주소 버스의 모든 라인을 검사하여 정확하게 하나의 메모리 위치 또는 입출력 장치 레지스터를 선택하는 방식이다. 8 비트 마이크로프로세서를 예로 설명하면, 16 비트 주소 라인을 가지고 있어서 64 KiB의 메모리에 접근할 수 있다. CPU가 매핑되지 않은 메모리 영역에 접근하면 오픈 데이터 버스 상태를 야기한다.4. 2. 불완전 주소 디코딩 (Incomplete Decoding)
주소 버스의 모든 라인을 검사하는 대신, 일부 라인만 검사하는 더 간단하고 저렴한 방식을 불완전 주소 디코딩(부분 디코딩)이라고 한다. 이 방식을 사용하면, 하나의 장치가 메모리 맵의 여러 주소에 반응하여 마치 여러 개의 가상본이 있는 것처럼 보이게 할 수 있다. 하지만 실제로는 모두 같은 장치를 가리킨다.이 방식은 디코더를 단순하게 만들 수 있다는 장점이 있다. 일반적으로 디코딩 논리는 프로그래밍 가능하므로, 시스템은 필요에 따라 메모리 맵을 재구성할 수 있다.
예를 들어, 16비트 주소 라인을 가진 8비트 마이크로프로세서 시스템에서, 64 키비바이트(KiB) 메모리 중 처음 32 KiB는 램에, 다음 16 KiB는 롬에 할당하고, 나머지를 다양한 장치에 할당할 수 있다. 이때 불완전 주소 디코딩을 사용하면, 특정 장치가 여러 주소에 반응하게 할 수 있다. 예를 들어, 비디오 컨트롤러의 네 번째 레지스터(A003)에 값을 기록하여 배경색을 지정하는 경우, 실제로는 하나의 레지스터이지만 여러 주소에서 접근 가능하도록 만들 수 있다.
4. 3. 선형 디코딩 (Linear Decoding)
주소 라인을 디코딩 로직 없이 직접 사용하는 방식이다. 이는 일련의 주소 입력을 갖는 RAM, ROM과 레지스터 뱅크를 어드레싱하기 위해 유사한 일련의 입력을 갖는 주변 칩과 같은 장치에서 수행된다. 선형 어드레싱은 단독으로 사용되는 경우는 드물고(버스에 장치가 거의 없는 경우에만 해당하며, 여러 장치에 순수한 선형 어드레싱을 사용하면 일반적으로 많은 주소 공간이 낭비됨), 대신 다른 방법 중 하나와 결합하여 선형 어드레싱이 단일 레지스터 또는 메모리 위치를 선택하는 장치 또는 장치 그룹을 선택한다.8비트 마이크로프로세서를 사용한 단순한 시스템을 예로 설명한다. 주소선이 16비트만큼 있으면 64,000B까지의 메모리를 주소 지정할 수 있다. 주소 공간의 선두 32,000B에 RAM을 배치하고, 공간의 맨 마지막 16,000B에 ROM을 배치한다. 남은 중간 16,000B의 공간을 각종 입출력 장치(타이머, 카운터, 비디오 디스플레이 칩, 사운드 제너레이터 등)에 할당한다. 버스에 연결된 이러한 장치는 맵핑된 주소가 버스에 나타났을 때 응답하고, 그 외의 주소는 무시한다. 이것은 주소 디코더의 역할이며, 이를 통해 시스템의 메모리 맵이 확립된다.
예를 들어, 비디오 컨트롤러의 4번째 레지스터에서 화면의 배경색을 설정한다고 할 때, CPU는 그 색을 A00316 라는 위치에 (일반적인 메모리 쓰기 명령으로) 쓴다. 마찬가지로 문자를 표시하고 싶다면, 텍스트 VRAM의 소정의 위치에 그것을 쓴다. 이것은 비트맵 이미지로 문자를 표시하는 것이 일반화되기 전에는 보통 행해졌던 기법이다 (텍스트 사용자 인터페이스 참조).
5. 메모리 맵 입출력의 주의점
캐시 메모리가 주소 접근을 중재하므로, 서로 다른 주소에 쓰인 데이터는 프로그램 순서와 다르게 주변 장치의 메모리나 레지스터에 도달할 수 있다. 즉, 소프트웨어가 한 주소에 데이터를 쓰고 다른 주소에 데이터를 쓸 때, 캐시 쓰기 버퍼는 데이터가 그 순서대로 주변 장치에 도달하는 것을 보장하지 않는다. 캐시 시스템이 쓰기 순서를 최적화하면, 각 쓰기 후에 캐시 플러싱 명령어를 포함하지 않는 프로그램은 의도치 않은 입출력 효과를 볼 수 있다. 메모리에 대한 쓰기는 중복을 줄이거나 메모리 접근 주기를 더 효율적으로 사용하기 위해 재정렬될 수 있으며, 저장된 최종 상태는 변하지 않는다. 그러나 동일한 최적화는 메모리 맵 I/O 영역에 대한 쓰기의 의미와 효과를 완전히 바꿀 수 있다.
메모리 맵 I/O 영역 선택 예측 부족은 이전 세대 컴퓨터에서 많은 RAM 용량 장벽을 초래했다. 설계자들은 기기가 아키텍처의 이론적 RAM 용량을 최대한 활용할 것으로 예상하지 않아, 주소 공간의 상위 비트를 메모리 맵 I/O 기능 선택기로 사용하곤 했다.
메모리 맵 입출력은 메모리와 입출력 장치가 같은 주소 공간에 있지만, 대부분 (적어도 하드웨어적으로) 전혀 다른 방식으로 처리해야 한다는 점에 주의해야 한다. 예를 들어, 라이트 백 방식 캐시 메모리를 쓰는 시스템에서는 읽고 쓰기를 해도 버스에 데이터가 나타나지 않는 경우가 있으므로, 해당 주소 공간에 대해 캐시를 무효화해야 한다. 또한, 입출력 장치 레지스터군은 접근 순서가 정해진 경우가 많아, 아웃 오브 오더 실행 영향을 받으면 입출력 조작이 엉망이 될 수 있다. 따라서 많은 경우 시스템에 어떤 방식으로든 순서를 강제하는 방법이 있다. (순서뿐 아니라 접근 간격을 일정 이상으로 하기 위해 대기가 필요한 경우도 있으며, 아웃 오브 오더 실행이 문제가 되는 시스템 구성에서는 메모리 맵 입출력을 채용할 수 없다.)
시스템에 순서를 강제하는 방법으로 전용 명령을 설정하기도 한다. 구체적인 예로, PowerPC의 `eieio` (enforce in-order execution of I/O instruction영어) 명령이 있다. 이는 메모리 맵 입출력을 실행할 때 쓰는 명령이며, 메모리 배리어로 기능한다. 즉, `eieio` 명령보다 앞선 로드 또는 스토어 명령이 완료된 후, `eieio` 명령 이후의 로드 또는 스토어 명령이 시작됨이 보장된다.[6][7]
참조
[1]
웹사이트
Bochs VBE Extensions - OSDev Wiki
https://wiki.osdev.o[...]
[2]
웹사이트
トランジスタ技術編集部
https://www.cqpub.co[...]
2020-12-11
[3]
웹사이트
よくわかる!定番!組込みソフトウェア開発技術の基礎
https://www.jasa.or.[...]
2020-12-11
[4]
서적
Computer Architecture and Organization
[5]
서적
PC-9801解析マニュアル[第0巻]
秀和システムトレーディング株式会社
1983-06-30
[6]
서적
The PowerPC architecture: A SPECIFICATION FOR A NEW FAMILY OF RISC PROCESSORS
Morgan Kaufmann PUblishers, Inc
[7]
서적
Optimizing PowerPC Code
Addison-Wesley Publishing Company
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com