libusb는 어떻게 커널에 접근합니까?


10

내가 이해 한 것에서 :

  • 일반적으로 드라이버는 커널 공간에서 실행되며 사용자 공간에서 호출 할 수 있습니다.
  • 커널 공간의 코드 만이 USB 하위 레벨을 호출 할 수 있습니다 / ioctl
  • libusb 라이브러리이므로 사용자 공간에서 컴파일 및 실행됩니다.

그렇다면 어떻게 libusb저수준 USB를 달성 할 수 있습니까?

답변:


10

Libusb는 curses가 텍스트 터미널과 상호 작용하는 라이브러리와 동일한 방식으로 USB 장치와 상호 작용하는 라이브러리이며 ALSA (보다 정확하게는 libasound 구성 요소)는 아우디 장치와 상호 작용하는 라이브러리입니다. 커널은 하드웨어 상호 작용을 처리합니다. 그것은 제공하는 장치 파일 응용 프로그램을 통해 하드웨어와 상호 작용하는 열 수 있습니다 read, write시스템 호출을 .ioctl

ioctl 시스템 호출 : 응용 프로그램 (사용자 레벨 코드)이 커널에 의해 처리되는 요청을 발행 할 수 있도록합니다.

Libusb를 통해 응용 프로그램은 장치에보고 할 무언가가있을 때 실행되는 콜백 기능을 등록 할 수 있습니다. 다음은 정보 흐름에 대한 대략적인 개요입니다.

  • 버스의 전기 신호는 USB 컨트롤러에서 이벤트를 트리거합니다.
  • USB 컨트롤러는 메인 프로세서에서 인터럽트 신호를 발생시킵니다.
  • 프로세서는 운영 체제 커널에서 인터럽트 핸들러를 실행합니다.
  • 프로세스가 블로킹 현재이라는 커널 사항 read, write또는 ioctl장치 파일에 시스템 호출 및 반환에 해당 시스템 호출을 발생합니다.
  • 사용자 랜드 프로세스에서 시스템 호출이 반환되면 라이브러리 코드가 실행됩니다.
  • 라이브러리 코드는 응용 프로그램 프로그래머가 등록한 콜백 함수를 실행합니다.

USB 장치 용 장치 드라이버를 작성할 필요가 없습니까? (아마도 속도 최적화가 아닌 경우)
Thomas

@Thomas 키보드, 스토리지, 이더넷 등 전송과 무관 한 프레임 워크에 연결하려면 커널 드라이버를 작성해야합니다. 그렇지 않으면, 사용자 프로그램의 지연 시간이 너무 길면 드라이버 만 필요하다고 생각합니다.
Gilles 'SO- 악의를 멈추십시오'

컴퓨터에서 장치를 인식하지 못하는 경우 (드라이버 없음) libusb여전히 장치에 액세스 할 수 있습니까?
Thomas

@Thomas 나는 libusb가 USB 프로토콜의 모든 측면에 대처할 수 있는지 모르겠지만 원칙적으로 그렇습니다. Userland 프로그램은을 통해 모든 RS232 직렬 장치와 통신 할 수 있습니다 /dev/ttyS*. USB는 동일한 원리이며 더 빠르고 복잡합니다.
Gilles 'SO- 악마 그만'

3

리눅스는 두 개의 링을 사용한다. 링 0은 커널 레벨, 링 3은 사용자 레벨이다. 사용자와 커널의 연결은 syscalls를 통해 (이미 말했듯이) 완료됩니다. 그 사이에는 사용자 영역에서 볼 수있는 라이브러리가 있습니다. 따라서 커널에 대한 가장 낮은 수준의 액세스는 안정성, 보안, 동기화, 저장 간격 등의 이유로 라이브러리에서 구현됩니다. 커널 드라이버는 사용자 공간에 다른 인터페이스를 제공합니다 : (ioctl, sysfs, 소켓, 문자 및 블록 장치 등) 사용자 공간 인터페이스 . 따라서 원하는 경우 라이브러리를 생략하여 커널 드라이버에 대한 액세스를 구현하거나 정적 링크 라이브러리로 바이너리를 훨씬 쉽게 컴파일 할 수 있습니다.

좋은 출발점은 libusb 소스를 읽는 것입니다.


0

이 사용 콜 (2) 커널 제조 장치 및 파일 ( /dev/bus/usb/*)


커널이 읽기와 쓰기를 받아들이는 알 수없는 장치를위한 특수 드라이버를 만든 것처럼 모든 것이 작동합니까? 인터럽트 등에 대한 알림은 어떻게 받습니까?
Thomas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.