2010-07-20 4 views
6

Come utilizzare la funzione find_module() del kernel linux? La documentazione dice "deve contenere module_mutex".Come usare find_module?

  1. Vuol dire che dovrei acquistare un blocco nel mio codice modulo prima alla ricerca di un puntatore ad un altro?
  2. Quando questo mutex è bloccato dal codice del kernel non modulo ?

Contesto

che sto debug di una serie di moduli del kernel a lavorare insieme.

Modulo A funzioni di chiamata del modulo B. Ad un certo punto nella funzione C del modulo A un conteggio di utilizzo del modulo B diventa non valido. Ho determined che questo non sta accadendo in funzione del modulo B. Vorrei eseguire il debug conteggio del modulo B da C. Per fare questo ho intenzione di utilizzare find_module() per ottenere un puntatore a B.

risposta

1

vorrei suggerire di essere un po 'più difensivo nel codice:

#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 acquisito dal kernel in varie operazioni su modu les. Tutti sono in /kernel/module.c e sono:

  • Nell'inizializzare ogni singolo modulo, così come tutti i moduli (all'avvio, per esempio).
  • Eliminazione di un modulo
  • Attendere fino a quando un modulo non viene fatto riferimento (utilizzato) da nessuno.
  • Quando il filesystem/proc richiede un elenco di moduli (oprofile e co. Si avvale di questo).
  • Nel codice relativo alla traccia; iterando e aggiornando i tracepoint.
0

1) Sì. Ottenere module_mutex nel modulo prima di chiamare find_module()

2) Non è utilizzato al di fuori del codice del modulo

Esempio:

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);