libusb如何访问内核内容?


10

据我了解:

  • 一般来说,驱动程序在内核空间中运行,可以从用户空间中调用。
  • 只有内核空间中的代码才能调用usb低级对象/ ioctl
  • libusb 是一个库,因此它将在用户空间中编译并运行

那么如何libusb实现低级USB?

Answers:


10

Libusb是一个与USB设备进行交互的库,而curses是一个与文本终端进行交互的库,ALSA(更确切地说是它的libasound组件)是一个与audi设备进行交互的库,等等。内核处理硬件交互。它提供了设备文件,应用程序可以打开与硬件交互,通过readwrite系统调用ioctl

ioctl 是系统调用:它允许应用程序(用户级代码)发出由内核处理的请求。

Libusb允许应用程序注册回调函数,这些回调函数在设备需要报告的内容时执行。以下是幕后信息流的粗略概述:

  • 总线上的电信号触发USB控制器上的事件。
  • USB控制器在主处理器上发出中断信号。
  • 处理器在操作系统内核中执行中断处理程序。
  • 内核注意到一个过程,目前在阻塞readwrite或者ioctl对设备的文件系统调用,并导致该系统调用返回。
  • 在用户登陆过程中,当系统调用返回时,将执行库代码。
  • 库代码执行应用程序程序员注册的回调函数。

因此,无需为USB设备编写设备驱动程序吗?(除非可能是为了进行速度优化)
Thomas

@Thomas如果要插入与传输无关的框架(键盘,存储设备,以太网等),则需要编写内核驱动程序。否则,我认为仅当userland程序的延迟过高时才需要驱动程序。
吉尔斯(Gillles)“所以-别再邪恶了”

如果计算机无法识别设备(没有驱动程序),libusb仍可以访问它吗?
Thomas

@Thomas我不知道libusb是否可以应付USB协议的所有方面,但原则上可以。用户级程序可以通过来与任何RS232串行设备通信/dev/ttyS*。USB是相同的原理,只是更快,更复杂。
吉尔(Gilles)'所以

3

Linux使用两个环,环0称为内核级,环3称为用户级。从用户到内核的连接是通过syscall完成的(正如之前所说的)。从用户空间看,它们之间是库。因此,出于稳定性,安全性,同步,节省空间等原因,在库中实现了对内核的最低级别访问。内核驱动程序为用户区提供了不同的接口:(ioctl,sysfs,套接字,字符和块设备等)用户空间接口。因此,如果需要,您可以通过省略库来实现对内核驱动程序的访问,或者使用静态链接库更轻松地编译二进制文件。

一个很好的起点是阅读libusb的源代码,它们有充分的文档记录。


0

它使用syscalls(2)和内核准备的设备文件(/dev/bus/usb/*


因此,一切工作都好像内核为未知设备制作了一个特殊驱动程序来接受读写操作一样?我们如何通知中断等?
托马斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.