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

33

Indo através do código fonte do Linux 2.6.36 em lxr.linux. Não , não encontrei 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() ?

    
por Sen 10.12.2010 / 08:03

2 respostas

36

Meta-resposta: Toda a matéria-prima que acontece no kernel do Linux passa pela 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() is one of the remaining parts of the kernel which runs under the Big Kernel Lock (BKL). In the past, the usage of the BKL has made it possible for long-running ioctl() methods to create long latencies for unrelated processes.

Segue uma explicação do patch que introduziu unlocked_ioctl e compat_ioctl em 2.6.11. A remoção do campo ioctl aconteceu muito mais tarde, em 2.6.36.

Explicação: Quando ioctl foi executado, foi necessário o Big Kernel Lock (BKL), então nada mais poderia executar ao mesmo tempo. Isso é muito ruim em uma máquina multiprocessadora, então houve um grande esforço para se livrar da BKL. Primeiro, unlocked_ioctl foi introduzido. Ele permite que cada gravador de driver escolha o bloqueio a ser usado. Isso pode ser difícil, então 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 pôde ser removido.

compat_ioctl na verdade não está relacionado, embora tenha sido adicionado ao mesmo tempo. Sua finalidade é permitir que programas de usuário de 32 bits 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 de driver.

    
por 10.12.2010 / 20:47
4

Existem casos em que a substituição de (include / linux / fs.h) struct arquivo_operações método ioctl () para compat_ioctl () no kernel 2.6.36 não funciona (por exemplo, para alguns drivers de dispositivo) e unlocked_ioctl () deve ser usado.

    
por 12.01.2011 / 17:09

Tags