2010-11-02 6 views
2

Le code suivant échoue dans l'un de mes modules linux-kerneldemande d'appel du noyau échoue dans try_module_get()

printk("This module: %p\n",THIS_MODULE); 
DEBUG_USE_COUNT(p); 
printk("This module refcount: %d\n", module_refcount(THIS_MODULE)); 
DEBUG_USE_COUNT(p); 
if (!try_module_get(THIS_MODULE)) { 
    printk_stderr("can't get module\n"); 
    return -EFAULT; 
} 

Le code lui-même travaille dans l'environnement habituel, mais lorsque je tente de l'exécuter dans la fonction appelée à partir dans un autre module, il échoue avec une erreur de pagination. (un autre module est passé le pointeur vers la fonction en question lors de l'initialisation) Des idées pour lesquelles le module ne peut pas incrémenter son compteur de référence étant appelé à partir d'un autre module? Y a-t-il des limitations spéciales qui s'appliquent à l'appel try_get_module?

[ 7888.065029] BUG: unable to handle kernel paging request at fa69206 
8 
[ 7888.067470] IP: [<f926a2b6>] _ZL18open_station_sharePKcP23__camac_ 
kernel_open_argP4file+0x84/0x8ec [camac_k0607_lsi6] //function in question, calling try_module_get() 
[ 7888.069014] Call Trace: 
[ 7888.069014] [<c10ac2b7>] ? __kmalloc+0x104/0x110 
[ 7888.069014] [<c12518f5>] ? printk+0xe/0x11 
[ 7888.069014] [<f90fae79>] ? T.633+0x46/0x4b [camac_mx] 
[ 7888.069014] [<f90fb07e>] ? camac_mx_ioctl+0x200/0x228 [camac_mx] //function of another module that calls the one in question 
[ 7888.069014] [<c10ba415>] ? vfs_ioctl+0x58/0x72 
[ 7888.069014] [<c10ba966>] ? do_vfs_ioctl+0x492/0x4d6 
[ 7888.069014] [<c109007b>] ? shmem_parse_options+0x167/0x281 
[ 7888.069014] [<c10ae69e>] ? fd_install+0x1b/0x38 
[ 7888.069014] [<c10ae88b>] ? do_sys_open+0xc8/0xdd 
[ 7888.069014] [<c10ba9ee>] ? sys_ioctl+0x44/0x64 
[ 7888.069014] [<c100305b>] ? sysenter_do_call+0x12/0x28 

Je serais également très bien si quelqu'un explique la poubelle sur le dessus de la pile imprimée. Il ne devrait pas y avoir de fonctions dans l'appel inter-module. Les trois premières fonctions de la pile n'ont aucun sens pour moi.

+0

Vous devriez probablement poster plus de détails. Je suppose que la source et un démontage avec des adresses correctes de _ZL18open_station_sharePKcP23__camac_ kernel_open_argP4file (est-ce que C++ dans le noyau?) Aiderait. – ninjalj

Répondre

1

THIS_MODULE peut évaluer à NULL si le fichier source particulier est compilé dans le noyau plutôt que dans le cadre d'un module, et module_refcount n'aime pas obtenir NULL.

En outre, l'utilisation de C++ dans les modules du noyau n'est pas recommandée car elle peut interférer avec tout (pensez aux exceptions et tout ça).

Questions connexes