it-swarm-pt.tech

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

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()?

40
Sen

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étodos ioctl() 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.

39

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 ().

4
Pawel Szyszuk