¿Cómo accede libusb a las cosas del kernel?


10

Por lo que entiendo:

  • En términos generales, un controlador se ejecuta en el espacio del kernel y se puede llamar desde el espacio del usuario.
  • Solo el código en el espacio del kernel puede llamar a cosas de bajo nivel usb / ioctl
  • libusb es una biblioteca, por lo que compilará y se ejecutará en el espacio del usuario

Entonces, ¿cómo libusblograr un USB de bajo nivel?

Respuestas:


10

Libusb es una biblioteca para interactuar con dispositivos USB de la misma manera que curses es una biblioteca para interactuar con terminales de texto, ALSA (más precisamente su componente libasound) es una biblioteca para interactuar con dispositivos audios, etc. El núcleo maneja las interacciones de hardware. Proporciona los archivos de dispositivo que las aplicaciones pueden abrir para interactuar con el hardware, a través de read, writey las llamadas al sistema .ioctl

ioctl es una llamada al sistema: permite que las aplicaciones (código de nivel de usuario) emitan solicitudes que son procesadas por el núcleo.

Libusb permite que las aplicaciones registren funciones de devolución de llamada que se ejecutan cuando el dispositivo tiene algo que informar. Aquí hay una descripción general del flujo de información bajo el capó:

  • La señal eléctrica en el bus desencadena un evento en el controlador USB.
  • El controlador USB genera una señal de interrupción en el procesador principal.
  • El procesador ejecuta el controlador de interrupciones en el núcleo del sistema operativo.
  • Los avisos del kernel que un proceso se encuentra actualmente en un bloqueo read, writeo ioctlllamada al sistema en el archivo de dispositivo y hace que la llamada al sistema de retorno.
  • En el proceso de aterrizaje del usuario, cuando vuelve la llamada del sistema, se ejecuta el código de la biblioteca.
  • El código de la biblioteca ejecuta la función de devolución de llamada registrada por el programador de la aplicación.

así que no hay necesidad de escribir controladores de dispositivo para dispositivos usb? (a menos que sea para optimizar la velocidad)
Thomas

@Thomas Debe escribir un controlador de kernel si desea conectarse a un marco independiente del transporte: teclado, almacenamiento, ethernet, etc. De lo contrario, creo que solo necesita un controlador si la latencia de un programa de usuario es demasiado alta.
Gilles 'SO- deja de ser malvado'

Si la computadora no reconoce un dispositivo (no tiene controlador), ¿ libusbaún podrá acceder a él?
Thomas

@Thomas No sé si libusb puede hacer frente a todos los aspectos del protocolo USB, pero en principio sí. Un programa de usuario puede comunicarse con cualquier dispositivo serie RS232 a través de /dev/ttyS*. USB es el mismo principio, solo que más rápido y más complejo.
Gilles 'SO- deja de ser malvado'

3

Linux usa dos anillos, el anillo 0 se llama nivel de núcleo, el anillo 3 se llama nivel de usuario. La conexión del usuario al kernel se realiza (como ya se dijo) a través de syscalls. Entre ellas están las bibliotecas, como se ve desde el país de los usuarios. Por lo tanto, el acceso de nivel más bajo al núcleo se implementa en bibliotecas, por razones de estabilidad, seguridad, sincronización, espacio de guardado, etc. El controlador del núcleo proporciona diferentes interfaces para el país de usuario: (ioctl, sysfs, sockets, dispositivos de caracteres y bloques, etc.) Interfaces de espacio de usuario . Entonces, si lo desea, puede implementar su acceso al controlador del kernel omitiendo las bibliotecas, o compilar mucho más fácilmente su binario con bibliotecas vinculadas estáticas.

Un buen punto de partida es leer las fuentes de libusb, están bien documentadas.


0

Utiliza syscalls (2) y archivos de dispositivo preparados por el kernel ( /dev/bus/usb/*)


¿Entonces todo funciona como si el kernel hiciera un controlador especial para dispositivos desconocidos que acepta lecturas y escrituras? ¿Cómo se nos notifica de las interrupciones, etc.?
Thomas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.