Ecriture de driver pour linux, discussion kernel->userland

Bonjour,
Je débute dans la programmation en mode noyau sous linux, et je me frotte actuellement à un problème épineux, je doit attraper une interruption et exécuter une routine d’interruption dont l’adresse se trouve en user land.

Mon problème se situe dans le passage kernel->user, en effet, je ne vois pas quel objet système utiliser pour synchroniser un processus user sur un évènement kernel.

Dans l’idéal, il faudrait que le handler d’interruption kernel puisse lancer un nouveau thread dans l’userland avec un pointeur de fonction(en userland) donné.

Voilà, merci de m’aiguiller si vous avez une idée !

Bonjour,

c’est un vaste sujet, il faut que tu lises la documentation du noyau pour cela.

Regarde ici http://oreilly.com/openbook/ tu as un livre pour écrire des drivers “linux devices drivers”.

Pour prévenir le userland tu as par exemple la fonction kill_fasync(&async_queue, SIGIO, POLL_IN);
qui envoie un signal dans le userland.

Regarde aussi la fonction fasync_helper(...;

Pour enregistrer la réception du signal dans le userland:

//hope an asynchronous notification, speed up the SIO signal.
    sa.sa_flags=SA_SIGINFO;
    sigemptyset(&sa.sa_mask);
    sa.sa_sigaction = sigio_handler;

puis les échanges peuvent se faire par des fonctions read/write ou ioctl…

regarde aussi les sources des programmes sur ton OS préféré :smiley:

Bon courage.