IO 장치에 액세스하는 장치 드라이버가 사용자 모드에서 직접 실행될 수 있습니까?

IO 장치에 액세스하는 장치 드라이버가 사용자 모드에서 직접 실행될 수 있습니까?

Linux의 장치 드라이버는 사용자 모드나 커널 모드에서 실행될 수 있다는 것을 읽었습니다.

또한 포트 매핑 IO를 사용하거나 메모리 매핑 IO를 사용하는 두 가지 방법 중 하나로 IO 장치에 액세스할 수 있다는 것도 알고 있습니다.

포트 매핑 IO에서는 IN명령어 및 를 사용하여 IO 장치에 액세스하는 OUT반면, 메모리 매핑 IO에서는 IO 장치의 레지스터가 커널 공간 메모리에 매핑됩니다(따라서 메모리에 액세스하는 일반 CPU 명령어를 사용하여 액세스할 수 있습니다 mov).


이제 장치 드라이버가 IO 장치에 직접 액세스하지 않고 대신 IO 장치가 연결된 IO 포트가 있는 장치 드라이버를 통해 통신하는 경우를 원합니다(예: 직렬 포트가 있는 장치 드라이버를 통해(IO 장치가 직렬 포트에 연결).

그러나 IO 장치가 포트 매핑 IO를 사용하는 경우 INOUT명령어는 권한 있는 명령어이므로 이를 사용하려면 커널 모드에 있어야 합니다. IO 장치가 메모리 매핑된 IO를 사용하는 경우 IO 장치 레지스터는 커널 공간 메모리에 매핑되며 커널 공간 메모리에 액세스하려면 커널 모드에 있어야 합니다.

그래서 IO 장치에 직접 액세스하는 장치 드라이버는 사용자 모드에서 실행될 수 없다고 생각합니다.

내 말이 맞나요, 아니면 뭔가 빠졌나요?

답변1

Q. IN, OUT 명령어는 특권 명령어이므로 이를 사용하려면 커널 모드에 있어야 합니다.

iopl(). 포트 번호가 충분히 낮으면 를 사용하도록 선택할 수도 있습니다 ioperm().

분명히 모든 아키텍처에서 지원되지는 않습니다.

바라보다inb, inl, inw를 사용하여 사용자 공간에서 커널 공간에 접근. 이 링크는 방법 및 샘플 코드 업데이트에 대한 링크입니다.

Q. IO 장치가 메모리 매핑된 IO를 사용하는 경우 IO 장치 레지스터는 커널 공간 메모리에 매핑되며 커널 공간 메모리에 액세스하려면 커널 모드에 있어야 합니다.

/dev/mem

이것은 XFree86/Xorg에서 그래픽 어댑터를 구동하는 데 사용됩니다!

인터럽트에 대해 언급하는 것을 잊었습니다. 이것이 가장 어려운 부분입니다. 다행스럽게도 이는 최신 PCI 장치에 대해 표준화되어 있으므로 장치별 커널 드라이버 없이도 구동할 수 있습니다. 바라보다사용자 공간 I/O HOWTO: 일반 PCI UIO 드라이버

PCI 장치 액세스에 대한 구체적인 세부 사항과 제한 사항이 무엇인지 잘 모르겠습니다.

DMA는 지원되지 않습니다. DMA에 대해 일부 메모리를 매핑할 수 있도록 최소 UIO 드라이버를 작성할 수 있습니다. UIO 방법을 참조하세요. 그러면 사용자 공간 드라이버는 DMA할 위치를 장치에 신중하게 알려줄 수 있습니다. 오류가 발생하면 장치는 시스템 RAM의 어느 위치에나 쓸 수 있습니다. 기쁨!

관련 정보