Comment créer un nœud de périphérique à partir de la init_module code d'un module du noyau Linux?
Je suis en train d'écrire un module pour le noyau linux et je veux créer des nœuds de périphérique dans la fonction init
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
//Now I want to create device nodes with the returned major number
}
Je veux aussi que le noyau d'attribuer un numéro mineur pour mon premier nœud, et puis je vais céder les autres nœuds " numéros mineurs par moi-même.
Comment puis-je faire dans le code. Je ne veux pas créer des dispositifs de la coquille à l'aide de mknod
Vous devez vous connecter pour publier un commentaire.
Avoir plus de contrôle sur les numéros de périphérique et de la création du périphérique vous pouvez effectuer les étapes suivantes (au lieu de
register_chrdev()
):alloc_chrdev_region()
pour obtenir un grand nombre et une gamme de numéros mineurs de travailler avec.class_create()
.cdev_init()
etcdev_add()
pour ajouter le caractère périphérique du système.device_create()
. Comme un résultat, entre autres choses, Udev permettra de créer des nœuds de périphérique pour vos appareils. Pas besoin demknod
ou similaires.device_create()
vous permet également de contrôler les noms de périphériques.Il y a probablement de nombreux exemples sur le Net, l'un d'eux est ici.
device_destroy
(elle prend également soin de supprimer le nœud de périphérique),cdev_del
annule l'inscription de l'appareil à partir du noyau. Après chaque périphérique a été supprimé,class_destroy
est appelé à supprimer la classe puis -unregister_chrdev_region
. Ce qui est fait lors de la création des dispositifs est annulée dans l'ordre inverse, comme d'habitude.device_create()
doit être appelée aprèscdev_add()
.cdev_add()
prépare le noyau des structures de maintenir l'appareil etdevice_create()
rend le dispositif à disposition de l'utilisateur de l'espace, entre autres choses. Et dès que vous faites de votre appareil à la disposition de l'espace utilisateur, ce dispositif doit être prêt à gérer les demandes à partir de là.cdev_add()
doit être appelée avantdevice_create()
. Qui semble être la plus commune de la commande.cdev_del
. Voir: stackoverflow.com/a/45531867/895245Minimum praticable exemple
Réduite à partir d'autres réponses. GitHub en amont avec l'installation d'essai.