목록에있는 세 가지 요소 중에서 실제로 첫 번째 요소 만 나열한 것입니다. 나머지는 - 실제로는 아닙니다. 사용자 공간 코드가 DMA 작업을 수행하는 것은 가능하지만 아무런 문제가 없습니다. 제품에서이 기술을 사용하는 많은 하드웨어 장비 회사가 있습니다. 모든 I/O가 전체 커널 바이 패스로 완료된 경우에도 인터럽트 기반 사용자 공간 응용 프로그램을 사용할 수 있습니다. 물론 mmap()
을 /dev/mem
에 붙이기 만하면 쉽지 않습니다.
커널에서 드라이버의 최소 부분 만 가져야합니다. 커널에서 필요한 최소한의 공간 만 사용자 공간에 제공해야합니다 (생각할 경우 /dev/mem
도 마찬가지이기 때문에). 문자 장치 드라이버에 의해 백업 됨).
DMA의 경우 실제로는 너무 쉽습니다. mmap
을 처리하고 DMA 버퍼를 사용자 공간에 매핑하면됩니다. 인터럽트의 경우 약간 더 까다 롭습니다.하지만 커널이 아무런 작업을하지 않고 그냥 호출하는 프로세스를 깨우면 (예 : epoll_wait()
) 커널이 인터럽트를 처리해야합니다. 또 다른 방법은 DOSEMU에서했던 것처럼 신호를 프로세스에 전달하는 것이지만, 속도가 매우 느리고 권장되지 않습니다.
실제 질문에 대한 고려 사항 중 하나는 리소스 공유입니다. 여러 응용 프로그램에서 장치를 공유 할 필요가 없으며 사용자 공간에서 수행 할 수있는 것이 아무것도 없으면 사용자 공간으로 이동하십시오. 사용자 공간 코드를 작성하는 것이 매우 쉽기 때문에 개발주기 동안 수분의 시간을 절약 할 수 있습니다. 그러나 두 개 이상의 응용 프로그램이 장치 (또는 해당 자원)를 공유해야하는 경우 여러 프로세스가 분기, 분기, 매핑 (같은 메모리) 등을 동시에 상상할 수있는 엄청난 시간을 할애 할 가능성이 있습니다 그리고 결국 IPC는 일반적으로 커널을 통해 수행되기 때문에 애플리케이션이 서로 "말하기"시작해야한다면 성능이 크게 저하 될 수 있습니다. 하지만 성능에 민감한 특정 응용 프로그램에 대해서는 여전히 실제 상황에서 수행되지만 이러한 세부 사항에 대해서는 원하지 않습니다.
또 다른 요소는 커널 인프라입니다. 네트워크 장치 드라이버를 작성한다고 가정 해 봅시다. 사용자 공간에서 그렇게하는 것이 문제가 아닙니다. 그러나 그렇게한다면 커널에있는 리눅스의 기본 리눅스를 사용할 수 없으므로 완전한 네트워크 스택을 작성해야 할 것이다.
가능한 경우 사용자 공간으로 이동하고 노력을하기위한 노력은 커널 드라이버를 작성하는 것보다 적습니다. 언젠가는 커널로 코드를 옮길 필요가 있음을 명심하십시오. . 실제로 이것은 사용자 공간에서의 테스트가 훨씬 더 즐겁기 때문에 매크로가 정의되어 있는지 여부에 따라 사용자 공간과 커널 공간 모두에 대해 동일한 코드가 컴파일되도록하는 일반적인 방법입니다.
보안 : 사용자가 장치를 열거 나 읽고 쓸 수있는 장치 노드 제어의 파일 권한. 파일 작업은 동시 작업을 거부하거나 허용합니다. – sawdust
결정은 PWM 기능과 하드웨어를 사용하는 것에 크게 의존 할 수 있습니다. –