Como a libusb acessa as coisas do kernel?

10

Pelo que entendi:

  • De um modo geral, um driver é executado no espaço do kernel e pode ser chamado a partir do espaço do usuário.
  • Apenas código no espaço do kernel pode chamar usb de baixo nível / ioctl
  • libusb é uma biblioteca, portanto, ela será compilada e executada no espaço do usuário

Então, como libusb alcança o nível baixo de USB?

    
por Thomas 15.01.2014 / 09:59

3 respostas

10

O Libusb é uma biblioteca para interagir com dispositivos USB da mesma maneira que curses é uma biblioteca para interagir com terminais de texto, ALSA (mais precisamente seu componente libasound) é uma biblioteca para interagir com dispositivos audi, etc. O kernel lida com interações de hardware. Ele fornece arquivos de dispositivo que os aplicativos podem abrir para interagir com o hardware, por meio de read , write e ioctl chamadas do sistema .

ioctl é uma chamada de sistema: permite que aplicativos (código de nível de usuário) emitam solicitações que são processos pelo kernel.

O Libusb permite que aplicativos registrem funções de retorno de chamada que são executadas quando o dispositivo tem algo a relatar. Aqui está uma visão geral do fluxo de informações sob o capô:

  • O sinal elétrico no barramento dispara um evento no controlador USB.
  • O controlador USB dispara um sinal de interrupção no processador principal.
  • O processador executa o manipulador de interrupção no kernel do sistema operacional.
  • O kernel percebe que um processo está atualmente em uma chamada de bloqueio read , write ou ioctl no arquivo do dispositivo e faz com que essa chamada do sistema retorne.
  • No processo de usuário, quando a chamada do sistema retorna, o código da biblioteca é executado.
  • O código da biblioteca executa a função de retorno de chamada registrada pelo programador da aplicação.
por 16.01.2014 / 03:24
3

O Linux usa dois toques O anel 0 é chamado de nível de kernel, o anel 3 é chamado de nível de usuário . A conexão do usuário ao kernel é feita (como já foi dito) via syscalls. Entre eles estão as bibliotecas, como visto da terra do usuário. Portanto, o acesso de nível mais baixo ao kernel é implementado em bibliotecas, por questões de estabilidade, segurança, sincronização, economizar espaçamento e assim por diante. O driver do kernel fornece diferentes interfaces para a área do usuário: (ioctl, sysfs, sockets, dispositivos de caractere e bloco e assim por diante) Interfaces de espaço do usuário . Então, se você quiser, você pode implementar o seu acesso ao driver do kernel sozinho omitindo as bibliotecas, ou muito mais fácil compilar seu binário com bibliotecas estáticas ligadas.

Um bom ponto de partida é ler as fontes do libusb, elas estão bem documentadas.

    
por 15.01.2014 / 23:49
0

Ele usa syscalls (2) e arquivos de dispositivos preparados pelo kernel ( /dev/bus/usb/* )

    
por 15.01.2014 / 10:38

Tags