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_ioctl
et compat_ioctl
dans la version 2.6.11. La suppression du ioctl
champ s'est produite beaucoup plus tard, en 2.6.36.
Explication: Lors de l' ioctl
exé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 ioctl
pourraient être supprimés.
compat_ioctl
n'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 ioctl
appels sur un noyau 64 bits. La signification du dernier argument ioctl
dépend du pilote, il n'y a donc aucun moyen d'effectuer une conversion indépendante du pilote.
unlocked_ioctl
cela que cela se produit? Le fait qu'un pointeur de fonction soit utilisé par fichier (dans ce cas-ci astruct file
) semble me rapprocher. Est-ce que lesunlocked_ioctl
fichiers de caractères sont enregistrés lors de l'initialisation du pilote aprèsmknod
?unlocked_ioctl
dans unstruct file_ops
quand il commence, et ils sont remplis à partir de lastruct file_ops
dans l'objet de fichier lorsque le fichier est ouvert.mknod
ne joue aucun rôle dans cela.mknod
exposer son interface via un périphérique de caractère avant de rediriger les opérations de fichier associées sur lui-même (viaunlocked_ioctl
).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