메모리 매핑 I/O

Memory-mapped I/O

메모리 매핑 I/O(MMIO)와 포트 매핑 I/O(PMIO)는 중앙 처리 장치(CPU)와 컴퓨터 주변 장치 간에 입출력(I/O)을 수행하는 두 가지 상호 보완적인 방법입니다.다른 방법으로는 메인프레임 컴퓨터의 채널로 알려진 전용 I/O 프로세서를 사용하여 자체 명령을 실행하는 방법이 있습니다.

메모리 매핑된 I/O는 동일주소 공간을 사용하여 메인 메모리와 I/O 디바이스모두 처리합니다.I/O 디바이스의 메모리 레지스터는 주소 값에 매핑됩니다(관련지어집니다).따라서 메모리 주소는 물리 RAM의 일부 또는 I/O 디바이스의 메모리 및 레지스터를 참조할 수 있습니다.따라서 메모리에 액세스하기 위해 사용되는 CPU 명령은 디바이스에 액세스하기 위해서도 사용할 수 있습니다.각 I/O 디바이스는 CPU의 주소버스를 감시하고 해당 디바이스에 할당된 주소의 CPU 액세스에 응답하여 데이터 버스를 원하는 디바이스의 하드웨어 레지스터에 접속한다.I/O 디바이스를 수용하려면 CPU에서 사용되는 주소 영역은 I/O용으로 예약되어 있어야 하며 일반 물리적 메모리에 사용할 수 있어야 합니다.예약은 영구적일 수도 있고 일시적일 수도 있습니다(뱅크 교환을 통해 달성).후자의 예는 Commodore 64에 있습니다.이 예에서는 메모리 매핑의 형식을 사용하여 RAM 또는 I/O하드웨어가 에 표시됩니다.0xD000-0xDFFF범위.

포트 매핑된 I/O는 많은 경우 I/O를 수행하기 위해 특별히 설계된 특별한 종류의 CPU 명령을 사용합니다.in그리고.outx86x86-64 아키텍처를 기반으로 하는 마이크로프로세서에 있는 명령어.이러한 2개의 명령의 다른 형식은 1, 2, 또는 4바이트를 복사할 수 있습니다(outb,outw그리고.outlEAX 레지스터 또는 CPU에 있는 레지스터의 서브섹션 중 하나와 I/O 디바이스에 할당되어 있는 특정 I/O 포트 사이에 있습니다.I/O 디바이스에는 CPU의 물리 인터페이스에 여분의 "I/O" 핀이 있거나 I/O 전용 버스 전체가 있는 일반 메모리와는 별도의 주소 공간이 있습니다.I/O용 주소 공간은 메인 메모리의 주소 공간으로부터 분리되어 있기 때문에, 이것을 격리된 I/[1]O라고 부르기도 합니다.

개요

정의상 DMA는 CPU를 바이패스하는 메모리-디바이스 통신 방식이기 때문에 메모리 매핑과 같은 다른 CPU-디바이스 통신 방식은 디바이스의 Direct Memory Access(DMA; 다이렉트메모리 액세스)에는 영향을 주지 않습니다.

하드웨어 인터럽트는 CPU와 주변기기 간의 또 다른 통신 방식이지만 여러 가지 이유로 인터럽트는 항상 별도로 취급됩니다.인터럽트는 CPU에 의해 개시되는 방법과는 달리 디바이스에서 개시됩니다.또한 정보는 디바이스에서 CPU로만 흐르기 때문에 단방향입니다.마지막으로 각 인터럽트 회선은 "이 인터럽트 회선상의 디바이스에서 주의가 필요한 이벤트가 발생했다"는 고정 의미의 정보를 1비트만 전송합니다.

주소 및 데이터 버스가 공유되면 I/O 작업이 메모리 액세스 속도를 저하시킬 수 있습니다.이는 보통 주변기기가 메인 메모리보다 훨씬 느리기 때문입니다.일부 아키텍처에서는 포트 매핑 I/O가 전용 I/O 버스를 통해 작동하므로 문제가 완화됩니다.

메모리 매핑 I/O의 장점 중 하나는 포트 I/O에 의해 발생하는 추가적인 복잡성을 배제함으로써 CPU는 내부 로직을 덜 필요로 한다는 것입니다.따라서 비용, 속도, 구축이 용이하고 전력 소비도 덜하며 물리적으로도 더 작다는 것입니다.는 명령 세트 컴퓨팅 감소라는 기본 원칙을 따르며 임베디드 시스템에서도 유리합니다.또 다른 장점은 일반 메모리 명령이 디바이스 어드레싱에 사용되기 때문에 I/O뿐만 아니라 모든 CPU 어드레싱 모드를 사용할 수 있으며 메모리 오퍼랜드(메모리 위치에서 오퍼랜드를 로드하고 결과를 메모리 위치에 저장 또는 둘 다)에서 ALU 작업을 직접 실행하는 명령도 사용할 수 있다는 것입니다.n I/O 디바이스 레지스터에서도 사용할 수 있습니다.이와는 대조적으로 포트 매핑 I/O 명령은 매우 제한적이며, CPU 레지스터와 I/O 포트 간의 단순한 로드 앤 스토어 조작에만 제공되는 경우가 많습니다.따라서 포트 매핑된 디바이스 레지스터에 상수를 추가하려면 포트를 CPU 레지스터에 읽기, 상수를 CPU 레지스터에 추가, 상수를 CPU 레지스터에 추가라는 세 가지 명령이 필요합니다.결과를 포트로 되돌립니다.

16비트 프로세서가 구식이 되어 일반적으로 32비트64비트로 대체되고 있기 때문에 프로세서의 메모리 주소 공간은 일반적으로 시스템 내의 모든 메모리 및 I/O 디바이스에 필요한 공간보다 훨씬 크기 때문에 I/O용으로 메모리 주소 공간을 예약하는 것은 문제가 되지 않습니다.따라서 메모리 매핑 I/O의 이점을 활용하는 것이 보다 빈번하게 실용화되었습니다.그러나 주소 공간이 더 이상 주요 관심사가 아니더라도 I/O 매핑 방식 중 어느 것도 다른 방법보다 보편적으로 우수하지 않으며 포트 매핑된 I/O를 사용하는 것이 여전히 바람직한 경우가 있습니다.

x86 기반 아키텍처에서는 메모리 매핑 I/O가 선호됩니다.이는 포트 기반 I/O를 실행하는 명령이 하나의 레지스터로 제한되기 때문입니다. EAX, AX 및 AL은 데이터를 이동하거나 이동할 수 있는 유일한 레지스터이며 명령의 바이트 크기 즉시 값 또는 레지스터 DX의 값이 소스 또는 대상 포트를 결정합니다.전송의 [2][3]이온 포트범용 레지스터는 메모리 및 메모리 매핑 I/O 디바이스와 데이터를 송수신할 수 있기 때문에 메모리 매핑 I/O는 사용하는 명령 수가 적고 포트 I/O보다 고속으로 실행할 수 있습니다.AMDx86-64 아키텍처를 64비트 포트를 지원하도록 정의할 때 포트 I/O 명령을 확장하지 않았기 때문에 포트 I/[4]O를 사용하여 64비트 전송을 수행할 수 없습니다.

메모리 장벽

캐시가 메모리 주소에 대한 액세스를 중개하기 때문에, 다른 주소에 쓴 데이터는 주변기기의 메모리에 도달하거나 프로그램 순서에서 등록될 수 있다.즉, 소프트웨어가 주소에 데이터를 쓰고 나서 다른 주소에 데이터를 쓰는 경우, 캐시 쓰기 버퍼는 데이터가 주변기기에 [5]그 순서로 도달하는 것을 보증하지 않는다.캐시 시스템이 쓰기 순서를 최적화하면, 시퀀스의 각 쓰기 후에 캐시 플러시 명령이 포함되지 않는 프로그램이 의도하지 않은 IO 효과를 볼 수 있습니다.메모리에 쓰기는 용장성을 줄이거나 저장된 내용의 최종 상태를 변경하지 않고 메모리 액세스 사이클을 효율적으로 활용하기 위해 순서를 변경할 수 있습니다.단, 동일한 최적화를 통해 메모리 매핑 I/O 영역에 쓰기의 의미와 효과가 완전히 달라질 수 있습니다.

메모리 매핑된 I/O 영역을 선택할 때 선견지명이 부족했기 때문에 구세대 컴퓨터에서는 RAM 용량의 장벽이 많이 생겼습니다.설계자는 아키텍처의 이론적인 RAM 용량을 최대한 활용하기 위해 머신이 확장될 것으로 예상하지 않았기 때문에 주소 공간의 상위 비트를 메모리 매핑 I/O 기능의 선택기로 사용하는 경우가 많습니다.예를 들어 IBM PC 및 파생 모델에서 640KB 장벽은 640~1024KB(64k 세그먼트 10~16)의 영역을 메모리 상부에 예약하기 때문입니다.이 선택은 처음에는 거의 영향을 주지 않았지만 결국 20비트의 사용 가능한 주소 공간 내에서 사용 가능한 총 RAM 용량이 제한되었습니다.3GB 장벽과 PCI 은 32비트 어드레스 공간에서도 마찬가지입니다.x86 부트 프로세스와 MMU 설계의 세부 사항으로 인해 악화됩니다.64비트 아키텍처에서도 기술적으로 유사한 문제가 발생하는 경우가 많지만 실제적인 결과는 거의 없습니다.

샘플 시스템 메모리 맵
주소 범위(16진수) 크기 장치
0000 – 7FF 32 KiB 들이받다
8000 ~ 80FF 256 바이트 범용 I/O
9000~90FF 256 바이트 사운드 컨트롤러
A000~A7FF 2 KiB 비디오 컨트롤러/텍스트 매핑 디스플레이 RAM
C000 –FFFF 16 KiB ROM

8비트 마이크로프로세서를 중심으로 구축된 단순한 시스템에서는 최대 64키비바이트(KiB)의 메모리를 주소 지정할 수 있는 16비트 주소 라인을 제공할 수 있습니다.이러한 시스템에서는 어드레스 공간의 첫 번째 32KiB는 랜덤 액세스 메모리(RAM)에 할당하고, 나머지 16KiB는 읽기 전용 메모리(ROM)에 할당하고, 나머지는 타이머, 카운터, 비디오 디스플레이 칩, 음성 발생 장치 등의 다양한 디바이스에 할당할 수 있다.

시스템의 하드웨어는 주소 버스상의 디바이스가, 그 이외의 주소는 모두 무시되고, 특정의 주소에만 응답하도록 배치되어 있습니다.이것은 주소 디코딩 회로의 작업으로, 시스템의 메모리 맵을 확립합니다.그 결과, 시스템의 메모리 맵은 오른쪽의 표와 같은 상태가 될 수 있습니다.이 메모리 맵에는 갭이 포함되어 있습니다.이것은 실제 시스템아키텍처에서도 매우 일반적인 것입니다.

비디오 컨트롤러의 제4 레지스터가 화면의 배경색을 설정했다고 가정하면 CPU는 표준 메모리 쓰기 명령을 사용하여 메모리 위치 A003에 값을 기입함으로써 이 색을 설정할 수 있다.같은 방법으로 비디오 컨트롤러 내의 RAM의 특수 영역에 문자값을 기입함으로써 화면에 그래프를 표시할 수 있습니다.값싼 RAM이 비트맵 디스플레이를 가능하게 하기 전에는 이 문자 셀 방식이 컴퓨터 비디오 디스플레이에서 인기 있는 기술이었다(텍스트 사용자 인터페이스 참조).

주소 디코딩의 기본 유형

주소 디코딩 유형(디바이스가 주소를 완전 또는 불완전하게 디코딩하는 경우)에는 다음이 포함됩니다.

완전한 디코딩(완전)
1개의 하드웨어 레지스터(물리 메모리 위치)에 대한 고유 주소의 1:1 매핑.주소 버스의 모든 회선을 확인합니다.
불완전한(부분) 디코딩
n개의 고유 주소를 1개의 하드웨어 레지스터에 n:1 매핑합니다.부분 디코딩은 메모리 위치를 둘 이상의 주소를 가질 수 있게 하여 프로그래머가 n개의 다른 주소를 사용하여 메모리 위치를 참조할 수 있게 합니다.또한 CPU의 모든 주소 공간이 필요하지 않은 경우 일부 주소 라인만 검사하는 단순하고 종종 저렴한 로직을 사용하여 디코딩 하드웨어를 단순화할 수도 있습니다.일반적으로 디코딩 자체는 프로그래밍이 가능하기 때문에 시스템은 필요에 따라 자체 메모리 맵을 재구성할 수 있습니다.단, 이는 새로운 개발로 일반적으로 더 저렴하다는 취지와 상충됩니다.
동의어: 폴드백, 다중 매핑, 부분 매핑, 주소 에일리어싱.[6][7]
선형 디코딩
주소 행은 디코딩 로직 없이 직접 사용됩니다.이것은 일련의 주소 입력이 있는 RAM이나 ROM 등의 디바이스와 레지스터 뱅크를 주소 지정하기 위한 유사한 입력 시퀀스를 가진 주변 칩을 사용하여 이루어집니다.리니어 어드레싱은 단독으로 사용하는 경우는 거의 없습니다(버스상에 디바이스가 거의 없는 경우만, 복수의 디바이스에 대해 순수하게 리니어 어드레싱을 사용하면 일반적으로 많은 주소 공간이 낭비됩니다).대신 다른 방법 중 하나와 조합하여 디바이스 또는 디바이스 그룹을 선택할 수 있습니다.이 방법에서는 리니어 어드레싱이 단일 레지스터 또는 메모리 loc를 선택합니다.ation.

디바이스 드라이버를 통한 포트 I/O

Windows 베이스의 컴퓨터에서는, DOLx8KD등의 특정의 드라이버를 통해서도 메모리에 액세스 할 수 있습니다.DOLLx8KD는 Windows 95에서 Windows 7까지의 대부분의 Windows 플랫폼에서 8비트, 16비트 및 32비트로 I/O 액세스를 제공합니다.I/O 포트 드라이버를 인스톨 하면, 포토 I/O 를 허가하는 심플한 DLL 콜에 의해서 드라이버를 액티브하게 하는 것으로, 메모리 액세스가 보증됩니다.또, 필요 없는 경우는 드라이버를 닫아, I/O 포토에의 부정 액세스를 방지할 수 있습니다.

Linux는pcimem 유틸리티를 사용하여 MMIO 주소의 읽기 및 쓰기를 허용합니다.Linux 커널에서는 커널의 mmiotrace 디버깅 기능을 사용하여 커널 모듈(드라이버)에서 MMIO 액세스를 추적할 수도 있습니다.이것을 유효하게 하려면 , Linux 커널을 대응하는 옵션을 유효하게 해 컴파일 할 필요가 있습니다.mmiotrace 는 클로즈드 소스 디바이스 드라이버의 디버깅에 사용됩니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "I/O - input/output" (PDF). people.cs.clemson.edu.
  2. ^ "Intel 64 and IA-32 Architectures Software Developer's Manual: Volume 2A: Instruction Set Reference, A-M" (PDF). Intel 64 and IA-32 Architectures Software Developer’s Manual. Intel Corporation. June 2010. pp. 3–520. Retrieved 2010-08-21.
  3. ^ "Intel 64 and IA-32 Architectures Software Developer's Manual: Volume 2B: Instruction Set Reference, N-Z" (PDF). Intel 64 and IA-32 Architectures Software Developer’s Manual. Intel Corporation. June 2010. pp. 4–22. Retrieved 2010-08-21.
  4. ^ "AMD64 Architecture Programmer's Manual: Volume 3: General-Purpose and System Instructions" (PDF). AMD64 Architecture Programmer's Manual. Advanced Micro Devices. November 2009. pp. 117, 181. Retrieved 2010-08-21.
  5. ^ ARM Cortex-A Series Programmer's Guide. Literature number ARM DEN0013D. pp. 10–3.
  6. ^ Microsoft (December 4, 2001). "Partial Address Decoding and I/O Space in Windows Operating Systems".
  7. ^ HP. "Address aliasing".