Re: Appel d'une fonction d'un module a partir du kernel

Pàgina inicial

Reply to this message
Autor: olivier.eribon
Data:  
A: Edgar Bonet
CC: Liste Guilde
Assumpte: Re: Appel d'une fonction d'un module a partir du kernel
Bonjour,

J'ai enfin trouve le temps de revenir sur ce probleme.
Vos informations deja tres completes m'ont permis de traiter le probleme comme
vous l'avez detaille.

Je joins juste ces quelques lignes pour finir de decrire la chose.

Dans le noyau : (ksyms.c)
=========================

(la fonction creuse)
int dummy_buzzer(int arg) {
printk("dummy_buzzer() called but buzzer module not loaded\n");
return 0;
}

int(*simple_buzzer)(int)=dummy_buzzer;

(export pour retrouver simple_buzzer dans /proc/ksyms)
EXPORT_SYMBOL(simple_buzzer);

(les appels utiles)
+ divers appels
extern int(*simple_buzzer)(int);
simple_buzzer(arg);

Dans le driver : (buzzer.c)
===========================

extern int(*simple_buzzer)(int);
static int (* dummy_simple_buzzer)(int);

(la veritable fonction)
int real_simple_buzzer(int arg)
{
.../...
return 0;
}

(a l'enregistrement du driver)
static int __init buzzer_init(void)

{

   int ret;                            /* Driver status */


   /* Register driver */
.../...
   dummy_simple_buzzer = simple_buzzer;
   simple_buzzer       = real_simple_buzzer;


return 0;
}

(au d'enregistrement du driver)
static void __exit buzzer_exit(void)

{
/* Unregister driver */
.../...
simple_buzzer = dummy_simple_buzzer;
}


Encore merci a tous et plus particulierement a Edgar.

Cordialement

Olivier

Quoting Edgar Bonet <guilde@???>:

> Le mercredi 26 janvier, olivier.eribon@??? a écrit :
> > Je recherche un moyen de faire appel a une fonction presente dans un module
> > maison (non realise pour etre integre statiquement au kernel) a partir du
> > kernel.
> >
> > Comment faire pour que le linker ne s'arrete pas sur
> > kernel/kernel.o(__ksymtab+0xc88): undefined reference to xxxxxx
> > et que lors du chargement du module la liaison a cette fonction soit
> resolue.
>
> J'ai jamais essayé la programmation noyau, mais voici toujours une idée,
> souvenir d'une ancienne lecture du module howto :
>
> Dans ton noyau tu définis une fonction bidon de même prototype, et un
> pointeur vers cette fonction. Par exemple, si tu prends et tu rends un
> int :
>
>     int dummy_foobar(int arg)
>     {
>         printk("foobar() called but foobar module not loaded\n");
>         return 0;
>     }

>
>     int (*foobar)(int) = dummy_foobar;

>
> Ensuite tu l'utilises via ce pointeur :
>
>     ...
>     foo = foobar(bar);
>     ...

>
> Dans ton module tu définis la vraie fonction :
>
>     int real_foobar(int arg)
>     {
>         ...
>     }

>
> Dans l'initialisation du module tu changes le pointeur :
>
>     foobar = real_foobar;

>
> et dans le cleanup tu remets l'ancien :
>
>     foobar = dummy_foobar;

>
> Tiens-nous au courant !
>
> Edgar.
>
> --
> Edgar Bonet           Maison : 04 76 21 29 16    Bureau : 04 76 88 10 96
> 3 rue Jean Prévost    Mobile : 06 77 19 79 39    Fax    : 04 76 88 11 91
> 38000 Grenoble        guilde@???     www.edgar-bonet.org

>