2016-03-15 5 views
0

En gros, j'essaie d'émettre un appel IOCTL à partir de l'espace noyau sans passer par l'espace utilisateur. (Toutes les réponses que j'ai trouvées dans SO proposent de passer par l'espace utilisateur). Plus précisément, j'essaie de remplir le pool d'entropie (/dev/random) à partir de l'espace du noyau (en utilisant un module noyau) [Je connais les dangers de faire cela;)]. Le remplissage du pool d'entropie à partir de l'espace utilisateur est effectué en utilisant IOCTL, par exemple rngaddentropy. Existe-t-il un moyen de faire la même chose à partir de l'espace noyau?IOCTL à partir de l'espace noyau

Répondre

2

Vous pouvez également utiliser ioctl à partir de l'espace du noyau.

Parce que commande ioctl RNDADDENTROPY est spécifique fichier, son traitement doit être mis en œuvre dans l'opération .unlocked_ioctl pour le fichier /dev/random (et il est effectivement mis en œuvre cette façon, voir la fonction random_ioctl).

Pour ioctl spécifiques au fichier des commandes que vous pouvez appeler l'opération de fichier directement .unlocked_ioctl:

// Open file 
struct file* f = filp_open("/dev/random", O_WRONLY, 0); 
// Replace user space with kernel space 
mm_segment_t old_fs = get_fs(); 
set_fs(KERNEL_DS); 

f->f_op->unlocked_ioctl(f, RNDADDENTROPY, entropy); 

// Restore space 
set_fs(old_fs); 

// Close file 
filp_close(f, 0); 
+0

Merci de répondre. Par curiosité: Que se passe-t-il si "/ dev/random" sous un autre nom de fichier? Existe-t-il un moyen de contourner l'appel 'ioctl' et d'ajouter des données au pool d'entropie? J'ai vérifié 'random.c' mais la fonction' write_pool' n'est pas exportée. – insumity

+0

Il existe des fonctions exportées à partir de ce fichier, comme [add_device_randomness] (http://lxr.free-electrons.com/source/drivers/char/random.c#L759). Probablement, vous trouverez certains d'entre eux utile pour vos fins. Quant à 'write_pool', il est appelé indirectement lors de l'écriture dans le fichier. – Tsyvarev