운영 체제 개념에서 메모리 매핑 파일과 메모리 매핑 I/O는 서로 다른 두 가지입니다. 메모리 매핑된 I/O에 대해서는 아래를 참조하세요.
메모리 매핑 파일을 사용하려면 mmap()
.
메모리 매핑된 I/O를 사용하려면 어떤 기능을 사용할 수 있나요? 메모리 매핑 I/O는 운영 체제에서 내부적으로만 사용되며 Linux의 프로그래머는 노출 및 사용하지 않습니까?
감사해요.
I/O의 경우 섹션 1.2.1에 설명된 대로 각 I/O 컨트롤러에는 전송되는 명령과 데이터를 보관하는 레지스터가 포함되어 있습니다. 일반적으로 특수 I/O 명령어를 사용하면 이러한 레지스터와 시스템 메모리 간의 데이터 전송이 가능합니다. I/O 장치에 더 쉽게 접근할 수 있도록 많은 컴퓨터 아키텍처에서는 다음을 제공합니다.메모리 매핑된 I/O. 이 경우 메모리 주소 범위가 예약되어 장치 레지스터에 매핑됩니다. 이러한 메모리 주소를 읽고 쓰면 데이터가 장치 레지스터로 전송되고 장치 레지스터로부터 전송됩니다. 이 방법은 비디오 컨트롤러와 같이 응답 시간이 빠른 장치에 적합합니다. IBM PC에서는 화면의 각 위치가 메모리 위치에 매핑됩니다. 화면에 텍스트를 표시하는 것은 적절한 메모리 매핑 위치에 텍스트를 쓰는 것만큼 간단합니다.
...
프로세서는 I/O 전송을 완료하기 위해 컨트롤러에 명령과 데이터를 어떻게 발행합니까?간단히 말해서 컨트롤러에는 데이터 및 제어 신호를 위한 하나 이상의 레지스터가 있습니다. 프로세서는 이러한 레지스터의 비트 패턴을 읽고 쓰는 방식으로 컨트롤러와 통신합니다. 이러한 의사소통이 이루어지는 한 가지 방법은 다음과 같습니다.특수 I/O 명령어를 사용하여I/O 포트 주소로 전송될 바이트 또는 단어를 지정합니다. I/O 명령어는 버스 라인을 트리거하여 올바른 장치를 선택하고 비트를 장치 레지스터 안팎으로 이동합니다. 또는 장치 컨트롤러가 다음을 지원할 수 있습니다.메모리 매핑된 I/O. 이 경우 장치 제어 레지스터는 프로세서의 주소 공간에 매핑됩니다. CPU는 물리적 메모리의 매핑된 위치에서 장치 제어 레지스터를 읽고 쓰기 위해 표준 데이터 전송 명령을 사용하여 I/O 요청을 수행합니다.
답변1
Linux에서는 MMIO를 사용자 공간에서 mmap
사용할 수 있습니다 /dev/mem
. 예를 들어 X 서버는 다음을 수행합니다.
fd = open("/dev/mem", O_RDWR);
if (ioBase == NULL) {
ioBase = (volatile unsigned char *) mmap(0, 0x20000,
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, ioBase_phys);
}
close(fd);
일부 경우에. 그러나 이것은 더 이상 사용되지 않으며 커널은 이러한 유형의 액세스를 사용하여 수행할 수 있는 작업을 엄격하게 제어합니다./dev/mem
필요CAP_SYS_RAWIO
, 현재 배포 커널은 자주 사용합니다.STRICT_DEVMEM
IO_STRICT_DEVMEM
접근을 제한 하고통과하다 /dev/mem
DOSEMU 또는 X에 필요하거나 장치에 매핑되거나 사용되지 않는 메모리의 여러 범위(즉드라이버가 처리하지 않는 장치에 대해 MMIO를 제공합니다.
답변2
메모리 매핑된 I/O는 mmap()
파일의 영역을 읽은 다음 매핑된 데이터를 사용하여 수행됩니다.
최신 OS를 사용하는 경우 OS는 mmapp을 사용하여 내부적으로 대부분의 I/O를 수행합니다.
파일의 일부를 임시 커널 영역에 매핑
copyout()
데이터를 사용자 주소 공간에 매핑합니다. 이로 인해 파일 내용이 커널의 임시 메모리 영역에 잘못 기록됩니다.지도 해제 지역
mmap()
참고: 사용자 공간에서 하드웨어에 액세스하는 것을 언급하는 경우 이는 일반적 으로 그래픽 보드에서 하드웨어를 가져와 사용자 공간에서 액세스하는 X 서버에 의해 수행됩니다 .
이 경우 장치 레지스터는 메모리 주소로 액세스할 수 있으며 커널 내부에 있는 것처럼 보이는 코드를 작성하기만 하면 됩니다. 즉, read() 또는 write()를 사용하지 않고 하드웨어 레지스터 주소에 대한 포인터를 역참조하기만 하면 됩니다.