Diferença de uso entre arquivos de dispositivos, ioctl, sysfs, netlink

8

Estou tentando esclarecer qual é o método mais útil (em termos de funcionalidade) de interação com dispositivos no Linux. Pelo que entendi, arquivos de dispositivos expõem apenas parte da funcionalidade (blocos de endereços em dispositivos de bloco, fluxos em dispositivos de caracteres, etc.). ioctl(2) parece ser o mais comumente usado, mas algumas pessoas dizem que não é seguro, e assim por diante.

Alguns bons artigos ou outros indicadores relevantes seriam bem-vindos.

    
por Constantine 05.08.2016 / 14:46

1 resposta

6

ioctl tende a andar de mãos dadas com uma entrada /dev ; seu código típico faria

fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);

Este é um comportamento Unix perfeitamente padrão. Dentro do driver do kernel você pode colocar controles de acesso (por exemplo, apenas root pode fazer algumas coisas, ou requer uma capacidade específica para acesso mais refinado) o que o torna bastante flexível e poderoso.

É claro que isso significa que os dispositivos podem expor muito mais do que usar a atividade de leitura / gravação de bloco / caractere; muitas coisas podem ser feitas via ioctl calls. Não é tão fácil de usar a partir de scripts de shell, mas é muito fácil de C ou perl ou python ou similar.

sysfs entradas são outra maneira de interagir com os drivers. Normalmente, cada tipo de comando teria uma entrada diferente, portanto, pode ser complicado escrever o driver, mas isso facilita o acesso via userspace; scripts de shell simples podem manipular muitas coisas, mas podem não ser muito eficientes

netlink é principalmente focado (eu acho!) em transferências de dados de rede, mas poderia ser usado para outras coisas. É muito bom para grandes volumes de transferência de dados e é supostamente um sucessor de ioctl em alguns casos.

Todas as opções são boas; seu caso de uso pode determinar melhor qual tipo de interface expor do seu driver.

    
por 05.08.2016 / 16:33