Qual é a diferença entre ioctl (), unlocked_ioctl () e compat_ioctl ()?

38

Passando pelo código-fonte do linux 2.6.36 em lxr.linux.no , não consegui encontrar o ioctl()método em file_operations. Em vez disso, encontrei duas novas ligações: unlocked_ioctl()e compat_ioctl(). Qual é a diferença entre ioctl(), unlocked_ioctl()e compat_ioctl()?

Sen
fonte

Respostas:

39

Meta-resposta: Todas as coisas cruas que acontecem no kernel do Linux passam por lkml (a lista de discussão do kernel do Linux) . Para resumos explicativos, leia ou pesquise o lwn (notícias semanais do Linux) .

Resposta: A partir da nova maneira de ioctl () por Jonathan Corbet :

ioctl()é uma das partes restantes do kernel que é executado sob o Big Kernel Lock (BKL). No passado, o uso do BKL tornou possível para aplicações de longa duraçãoioctl() métodos de longa criar latências longas para processos não relacionados.

Segue uma explicação do patch que introduziu unlocked_ioctlecompat_ioctl no 2.6.11. A remoção do ioctlcampo aconteceu muito depois, em 2.6.36.

Explicação: Quando ioctlfoi executado, foi necessário o Big Kernel Lock (BKL), para que nada mais pudesse ser executado ao mesmo tempo. Isso é muito ruim em uma máquina com multiprocessador, portanto houve um grande esforço para se livrar do BKL. Primeiro,unlocked_ioctl foi introduzido. Ele permite que cada gravador de driver escolha qual bloqueio usar. Isso pode ser difícil, portanto houve um período de transição durante o qual os drivers antigos ainda funcionavam (usando ioctl), mas os novos drivers podiam usar a interface aprimorada ( unlocked_ioctl). Eventualmente, todos os drivers foram convertidos e ioctlpodem ser removidos.

compat_ioctlna verdade não é relacionado, mesmo que tenha sido adicionado ao mesmo tempo. Seu objetivo é permitir que programas de 32 bits do usuário façam ioctlchamadas em um kernel de 64 bits. O significado do último argumento para ioctldepende do driver, portanto, não há como fazer uma conversão independente do driver.

Gilles 'SO- parar de ser mau'
fonte
1
Eu estava olhando a fonte ioctl mais recente e vi que o syscall faz algumas verificações e depois pula aqui . Você sabe onde eu poderia obter mais informações sobre o sistema ioctl? Estou interessado em saber como os comandos ioctl nos arquivos de caracteres são roteados para o driver apropriado. É por unlocked_ioctlisso que isso acontece? O fato de um ponteiro de função ser usado por arquivo (neste caso a struct file) parece que posso estar perto. O unlocked_ioctlregistro para os arquivos de caracteres na inicialização do driver é posterior mknod?
precisa saber é o seguinte
1
@sherrellbc O driver do dispositivo registra os métodos de manipulação de arquivos, como unlocked_ioctlem a, struct file_opsquando é iniciado, e eles são preenchidos do struct file_opsobjeto de arquivo quando o arquivo é aberto. mknodnão desempenha nenhum papel nisso.
Gilles 'SO- stop be evil'
Entendo. Eu estava pensando que um driver de dispositivo deve primeiro mknodexpor sua interface através de um dispositivo de caractere antes de redirecionar as operações de arquivo associadas para si (via unlocked_ioctl).
precisa saber é o seguinte
4

Há casos em que a substituição do método struct (file /operations / linux / fs.h) struct ioctl () por compat_ioctl () no kernel 2.6.36 não funciona (por exemplo, para alguns drivers de dispositivo) e unlocked_ioctl ().


fonte