Passando pelo código-fonte do linux 2.6.36 em lxr.linux.no , não consegui encontrar o método ioctl()
em file_operations
. Em vez disso, encontrei duas novas chamadas: unlocked_ioctl()
e compat_ioctl()
. Qual é a diferença entre ioctl()
, unlocked_ioctl()
e compat_ioctl()
?
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 lwn (Notícias semanais do Linux) .
Resposta: De A 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 os métodosioctl()
de longa execução criar latências longas para processos não relacionados.
Segue uma explicação do patch que introduziu unlocked_ioctl
e compat_ioctl
em 2.6.11. O remoção do campo ioctl
aconteceu muito mais tarde, na 2.6.36.
Explicação: Quando ioctl
foi executado, foi utilizado o Big Kernel Lock (BKL), para que nada mais pudesse ser executado ao mesmo tempo. Isso é muito ruim em uma máquina multiprocessadora, 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 ioctl
podem ser removidos.
compat_ioctl
não é realmente relacionado, mesmo que tenha sido adicionado ao mesmo tempo. Seu objetivo é permitir que os programas de 32 bits do usuário façam chamadas ioctl
em um kernel de 64 bits. O significado do último argumento para ioctl
depende do driver; portanto, não há como fazer uma conversão independente do driver.
Existem 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 ().