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

12

Estou tentando esclarecer qual é o método mais útil (em termos de funcionalidade) de interagir com dispositivos no Linux. Pelo que entendi, os 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 mais usado, mas algumas pessoas dizem que não é seguro e assim por diante.

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

Constantine
fonte

Respostas:

9

ioctltende a andar de mãos dadas com uma /deventrada; seu código típico faria

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

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

Obviamente, isso significa que os dispositivos podem expor muito mais do que usar atividades de leitura e gravação de bloco / caractere; muitas coisas podem ser feitas através de ioctlchamadas. Não é tão fácil de usar a partir de scripts de shell, mas muito fácil a partir de Cou perlou pythonou similar.

sysfsentradas são outra maneira de interagir com os motoristas. Normalmente, cada tipo de comando teria uma entrada diferente; portanto, pode ser complicado escrever o driver, mas facilita o acesso pelo espaço do usuário; scripts shell simples podem manipular muitas coisas, mas podem não ser muito eficientes

netlinké focado principalmente (eu acho!) nas transferências de dados da rede, mas poderia ser usado para outras coisas. É realmente bom para grandes volumes de transferência de dados e deve ser um sucessor ioctlem alguns casos.

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

Stephen Harris
fonte
1
Adicionando mais para confundir: "ioctl: no entanto, o ioctl está obsoleto no kernel, e você achará difícil obter drivers com novos usos do ioctl aceitos upstream. Os mantenedores do kernel não gostam do ioctl porque tornam o código do kernel e o código do aplicativo muito interdependentes , e é difícil acompanhar os dois nas versões e arquiteturas do kernel ". [Página 255] "Mastering Embedded Linux Programming" por Chris Simmonds [2017].
Israr 11/01
Isso acrescenta uma pergunta: Então podemos acessar o sysfs de C?
Israr 11/01