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_ioctl
ecompat_ioctl
no 2.6.11. A remoção do ioctl
campo aconteceu muito depois, em 2.6.36.
Explicação: Quando ioctl
foi 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 ioctl
podem ser removidos.
compat_ioctl
na 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 ioctl
chamadas 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.
unlocked_ioctl
isso que isso acontece? O fato de um ponteiro de função ser usado por arquivo (neste caso astruct file
) parece que posso estar perto. Ounlocked_ioctl
registro para os arquivos de caracteres na inicialização do driver é posteriormknod
?