Comment utiliser ioctl () depuis l’espace kernel sous Linux?

Est-il possible d’appeler ioctl partir d’un module de kernel Linux? Quelqu’un peut-il donner un exemple de son utilisation?

Vous pouvez essayer d’appeler sys_ioctl .
Il est exporté si le kernel est compilé avec CONFIG_COMPAT .

Ou, si vous avez la struct file_operations du pilote de struct file_operations , vous pouvez appeler directement son gestionnaire ioctl .

Cependant, le descripteur ioctl s’attend à ce que les parameters de pointeur se trouvent dans l’espace d’adressage du processus en cours d’exécution, et non dans l’espace d’adressage du kernel. copy_from_user serait utilisé pour les lire. Si vous atsortingbuez des pointeurs à l’espace d’adressage du kernel, copy_from_user échouera. Je ne vois pas comment vous pourriez vous en sortir.

Modifier:

Si vous appelez le gestionnaire ioctl entre le code ci-dessous, copy_from_user n’échouera jamais.

  mm_segment_t fs; fs = get_fs(); /* save previous value */ set_fs (get_ds()); /* use kernel limit */ /* system calls can be invoked */ set_fs(fs); /* restore before returning to user space */