메모리 매핑 I/O는 운영 체제에서 내부적으로만 사용되며 Linux의 프로그래머는 노출 및 사용하지 않습니까?

메모리 매핑 I/O는 운영 체제에서 내부적으로만 사용되며 Linux의 프로그래머는 노출 및 사용하지 않습니까?

운영 체제 개념에서 메모리 매핑 파일과 메모리 매핑 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_DEVMEMIO_STRICT_DEVMEM접근을 제한 하고통과하다 /dev/memDOSEMU 또는 X에 필요하거나 장치에 매핑되거나 사용되지 않는 메모리의 여러 범위(드라이버가 처리하지 않는 장치에 대해 MMIO를 제공합니다.

답변2

메모리 매핑된 I/O는 mmap()파일의 영역을 읽은 다음 매핑된 데이터를 사용하여 수행됩니다.

최신 OS를 사용하는 경우 OS는 mmapp을 사용하여 내부적으로 대부분의 I/O를 수행합니다.

  • 파일의 일부를 임시 커널 영역에 매핑

  • copyout()데이터를 사용자 주소 공간에 매핑합니다. 이로 인해 파일 내용이 커널의 임시 메모리 영역에 잘못 기록됩니다.

  • 지도 해제 지역

mmap()참고: 사용자 공간에서 하드웨어에 액세스하는 것을 언급하는 경우 이는 일반적 으로 그래픽 보드에서 하드웨어를 가져와 사용자 공간에서 액세스하는 X 서버에 의해 수행됩니다 .

이 경우 장치 레지스터는 메모리 주소로 액세스할 수 있으며 커널 내부에 있는 것처럼 보이는 코드를 작성하기만 하면 됩니다. 즉, read() 또는 write()를 사용하지 않고 하드웨어 레지스터 주소에 대한 포인터를 역참조하기만 하면 됩니다.

관련 정보