Quelle est la différence entre ioctl (), unlocked_ioctl () et compat_ioctl ()?

38

En passant par le code source Linux 2.6.36 à lxr.linux.no , je n’ai pas trouvé la ioctl()méthode file_operations. Au lieu de cela, j'ai trouvé deux nouveaux appels: unlocked_ioctl()et compat_ioctl(). Quelle est la différence entre ioctl(), unlocked_ioctl()et compat_ioctl()?

Sen
la source

Réponses:

39

Méta-réponse: Tous les éléments bruts du noyau Linux passent par lkml (la liste de diffusion du noyau Linux) . Pour des résumés explicatifs, lisez ou recherchez lwn (Linux hebdomadaire) .

Réponse: De la nouvelle façon d'ioctl () de Jonathan Corbet :

ioctl()est l'une des parties restantes du noyau qui s'exécute sous le Big Kernel Lock (BKL). Dans le passé, l'utilisation de BKL permettait à des ioctl()méthodes de longue durée de créer de longues latences pour des processus non liés.

Suit une explication du correctif qui a introduit unlocked_ioctlet compat_ioctldans la version 2.6.11. La suppression du ioctlchamp s'est produite beaucoup plus tard, en 2.6.36.

Explication: Lors de l' ioctlexécution, le verrou du gros noyau (BKL) a été utilisé, afin que rien d'autre ne puisse s'exécuter en même temps. Ceci est très grave sur une machine multi-processeurs, il y a donc eu un gros effort pour se débarrasser du BKL. Tout d'abord, a unlocked_ioctlété introduit. Il permet à chaque rédacteur de pilote de choisir le verrou à utiliser à la place. Cela peut être difficile, il y a donc eu une période de transition au cours de laquelle les anciens pilotes fonctionnaient toujours (utilisation ioctl) mais les nouveaux pilotes pouvaient utiliser l'interface améliorée ( unlocked_ioctl). Finalement, tous les pilotes ont été convertis et ioctlpourraient être supprimés.

compat_ioctln'est en fait pas lié, même s'il a été ajouté en même temps. Son but est de permettre aux programmes utilisateur 32 bits de faire des ioctlappels sur un noyau 64 bits. La signification du dernier argument ioctldépend du pilote, il n'y a donc aucun moyen d'effectuer une conversion indépendante du pilote.

Gilles, arrête de faire le mal
la source
1
Je regardais la dernière source d’ioctl et j’ai vu que l’appel système effectuait quelques vérifications, puis sautait ici . Savez-vous où je pourrais rassembler plus d'informations sur le système ioctl? Je suis intéressé par la façon dont les commandes ioctl sur les fichiers de caractères sont routées vers le pilote approprié. Est-ce à travers unlocked_ioctlcela que cela se produit? Le fait qu'un pointeur de fonction soit utilisé par fichier (dans ce cas-ci a struct file) semble me rapprocher. Est-ce que les unlocked_ioctlfichiers de caractères sont enregistrés lors de l'initialisation du pilote après mknod?
sherrellbc
1
@sherrellbc Le pilote de périphérique enregistre les méthodes de gestion de fichiers tels que unlocked_ioctldans un struct file_opsquand il commence, et ils sont remplis à partir de la struct file_opsdans l'objet de fichier lorsque le fichier est ouvert. mknodne joue aucun rôle dans cela.
Gilles 'SO- arrête d'être méchant'
Je vois. Je pensais qu'un pilote de périphérique devait d'abord mknodexposer son interface via un périphérique de caractère avant de rediriger les opérations de fichier associées sur lui-même (via unlocked_ioctl).
sherrellbc
4

Il y a des cas où le remplacement de (include / linux / fs.h) de la méthode struct file_operations ioctl () par compat_ioctl () dans le noyau 2.6.36 ne fonctionne pas (par exemple, pour certains pilotes de périphérique) et que unlocked_ioctl () doit être utilisé.


la source