2013-03-08 2 views
24

PWM 드라이버를 쓰려고합니다.사용자 공간 대 커널 공간 드라이버

  1. 사용자 공간 드라이버 : 나는 우리가 하드웨어 드라이버를 제어 할 수있는 두 가지 방법이 있다는 것을 알고있다.

일반적으로 우리는 사용자 공간이나 커널 공간 드라이버를 이동할지 여부를 결정을해야한다 (A PWM 드라이버의 경우를 고려하지 않는) 경우

  • 커널 공간 드라이버. 그렇다면 이것들과 별도로 우리가 고려해야 할 요소는 무엇입니까?

    1. 사용자 공간 드라이버는 가상 주소 공간에 직접 메모리를 mmap()/dev/mem 할 수 있으며 컨텍스트 스위칭이 필요 없습니다.
    2. 사용자 공간 드라이버는 인터럽트 핸들러를 구현할 수 없습니다 (인터럽트를 위해 폴링해야 함).
    3. 사용자 공간 드라이버가 DMA를 수행 할 수 없습니다 (커널 공간에서 DMA 가능 메모리를 할당 할 수 있음).
  • +1

    보안 : 사용자가 장치를 열거 나 읽고 쓸 수있는 장치 노드 제어의 파일 권한. 파일 작업은 동시 작업을 거부하거나 허용합니다. – sawdust

    +1

    결정은 PWM 기능과 하드웨어를 사용하는 것에 크게 의존 할 수 있습니다. –

    답변

    31

    목록에있는 세 가지 요소 중에서 실제로 첫 번째 요소 만 나열한 것입니다. 나머지는 - 실제로는 아닙니다. 사용자 공간 코드가 DMA 작업을 수행하는 것은 가능하지만 아무런 문제가 없습니다. 제품에서이 기술을 사용하는 많은 하드웨어 장비 회사가 있습니다. 모든 I/O가 전체 커널 바이 패스로 완료된 경우에도 인터럽트 기반 사용자 공간 응용 프로그램을 사용할 수 있습니다. 물론 mmap()/dev/mem에 붙이기 만하면 쉽지 않습니다.

    커널에서 드라이버의 최소 부분 만 가져야합니다. 커널에서 필요한 최소한의 공간 만 사용자 공간에 제공해야합니다 (생각할 경우 /dev/mem도 마찬가지이기 때문에). 문자 장치 드라이버에 의해 백업 됨).

    DMA의 경우 실제로는 너무 쉽습니다. mmap을 처리하고 DMA 버퍼를 사용자 공간에 매핑하면됩니다. 인터럽트의 경우 약간 더 까다 롭습니다.하지만 커널이 아무런 작업을하지 않고 그냥 호출하는 프로세스를 깨우면 (예 : epoll_wait()) 커널이 인터럽트를 처리해야합니다. 또 다른 방법은 DOSEMU에서했던 것처럼 신호를 프로세스에 전달하는 것이지만, 속도가 매우 느리고 권장되지 않습니다.

    실제 질문에 대한 고려 사항 중 하나는 리소스 공유입니다. 여러 응용 프로그램에서 장치를 공유 할 필요가 없으며 사용자 공간에서 수행 할 수있는 것이 아무것도 없으면 사용자 공간으로 이동하십시오. 사용자 공간 코드를 작성하는 것이 매우 쉽기 때문에 개발주기 동안 수분의 시간을 절약 할 수 있습니다. 그러나 두 개 이상의 응용 프로그램이 장치 (또는 해당 자원)를 공유해야하는 경우 여러 프로세스가 분기, 분기, 매핑 (같은 메모리) 등을 동시에 상상할 수있는 엄청난 시간을 할애 할 가능성이 있습니다 그리고 결국 IPC는 일반적으로 커널을 통해 수행되기 때문에 애플리케이션이 서로 "말하기"시작해야한다면 성능이 크게 저하 될 수 있습니다. 하지만 성능에 민감한 특정 응용 프로그램에 대해서는 여전히 실제 상황에서 수행되지만 이러한 세부 사항에 대해서는 원하지 않습니다.

    또 다른 요소는 커널 인프라입니다. 네트워크 장치 드라이버를 작성한다고 가정 해 봅시다. 사용자 공간에서 그렇게하는 것이 문제가 아닙니다. 그러나 그렇게한다면 커널에있는 리눅스의 기본 리눅스를 사용할 수 없으므로 완전한 네트워크 스택을 작성해야 할 것이다.

    가능한 경우 사용자 공간으로 이동하고 노력을하기위한 노력은 커널 드라이버를 작성하는 것보다 적습니다. 언젠가는 커널로 코드를 옮길 필요가 있음을 명심하십시오. . 실제로 이것은 사용자 공간에서의 테스트가 훨씬 더 즐겁기 때문에 매크로가 정의되어 있는지 여부에 따라 사용자 공간과 커널 공간 모두에 대해 동일한 코드가 컴파일되도록하는 일반적인 방법입니다.

    +0

    좋은 답변입니다. 나는이 정보를 찾고 있었고 당신의 대답은 매우 유용했습니다. –

    +0

    그러나 epoll은 마침내 빠른 메커니즘을 가지고 있습니다. 폴링 구조는 인터럽트 처리기가 아닙니다. 시간이 중요한 작업에 문제가 발생할 수 있습니다. – obayhan

    6

    또 다른 고려 사항 : 사용자 공간 드라이버를 디버그하는 것이 훨씬 쉽습니다. 당신은 gdb, valgrind 등을 사용할 수 있습니다. Heck, C로 드라이버를 작성하지 않아도됩니다.

    사용자 공간이나 커널 공간 드라이버 이외에 세 번째 옵션이 있습니다 : 둘 중 하나의 옵션입니다. 커널 드라이버에서 커널 공간 만 사용하고 사용자 공간에서 다른 모든 작업을 수행 할 수 있습니다. Linux UIO 드라이버 프레임 워크를 사용하는 경우 커널 공간 드라이버를 작성하지 않아도됩니다 (https://www.kernel.org/doc/html/latest/driver-api/uio-howto.html 참조).

    나는 거의 모든 사용자 공간에서 DMA 가능 드라이버를 작성했다. UIO는 인프라를 제공하므로 인터럽트를 기다리는 파일을 읽거나/select/epoll 할 수 있습니다.

    당신은 사용자 공간에서 DMA 디스크립터를 프로그램의 보안 문제를 인식해야한다 : 장치 자체 또는 IOMMU에 약간의 보호가 없다면, 사용자 공간 드라이버를 읽거나 모든 주소에 쓸 장치를 일으킬 수 있습니다 물리적 메모리

    관련 문제