2010-07-20 18 views
6

Comment utiliser la fonction find_module() du noyau Linux? La documentation dit "doit contenir module_mutex".Comment utiliser find_module?

  1. Est-ce que cela signifie que je devrais acquérir un verrou dans mon code de module avant la recherche d'un pointeur vers une autre?
  2. Lorsque ce mutex est verrouillé par code noyau non-module?

Contexte

Je suis mise au point d'un ensemble de modules du noyau travaillant ensemble. Module A Fonctions d'appel du module B. A un certain moment dans la fonction C du module A, le compte d'utilisation du module B devient invalide. J'ai determined que cela ne se produit pas en fonction du module B. Je voudrais déboguer le compte d'utilisation du module B de C. Pour ce faire, je vais utiliser find_module() pour obtenir un pointeur vers B.

Répondre

1

Je suggère d'être un peu plus défensif dans votre code:

#include <linux/module.h> 
#include <linux/capability.h> 

int do_my_work(void) 
{ 
    struct module *mod; 
    char name[MODULE_NAME_LEN]; 
    int ret, forced = 0; 

    if (!capable(CAP_SYS_MODULE) || modules_disabled) 
     return -EPERM; 

    /* Set up the name, yada yada */ 
    name[MODULE_NAME_LEN - 1] = '\0'; 

    /* Unless you absolutely need an uninterruptible wait, do this. */ 
    if (mutex_lock_interruptible(&module_mutex) != 0) { 
     ret = -EINTR; 
     goto out_stop; 
    } 

    mod = find_module(name); 
    if (!mod) { 
     ret = -ENOENT; 
     goto out; 
    } 

    if (!list_empty(&mod->modules_which_use_me)) { 
     /* Debug it. */ 
    } 

out: 
    mutex_unlock(&module_mutex); 
out_stop: 
    return(ret); 
} 

module_mutex est acquis par le noyau dans diverses opérations sur modu les. Tous sont dans /kernel/module.c et sont les suivants:

  • Lors de l'initialisation de chaque module individuellement, ainsi que tous les modules (au démarrage, par exemple).
  • Suppression d'un module
  • Attente jusqu'à ce qu'un module ne soit référencé (utilisé) par personne.
  • Lorsque le système de fichiers/proc a besoin d'une liste de modules (oprofile et co utilise).
  • En code lié au point de trace; itérer et mettre à jour les points de trace.
0

1) Oui. Obtenez module_mutex dans votre module avant d'appeler find_module()

2) Il n'est pas utilisé en dehors du code du module

Exemple:

struct module *mod; 

mutex_lock(&module_mutex); 

mod = find_module("MODULE_NAME"); 

if(!mod) { 
    printk("Could not find module\n"); 
    return; 
} 

mutex_unlock(&module_mutex);