2010-07-20 15 views
6

Wie die Funktion find_module() des Linux-Kernels zu verwenden? Die Dokumentation sagt "muss modul_mutex halten".Wie finde ich find_module?

  1. Heißt das, dass ich auf einem anderen für einen Zeiger eine Sperre in meinem Modul Code vor Suche erwerben sollte?
  2. Wenn dieser Mutex von Nicht-Modul-Kernel-Code gesperrt ist?

Kontext

Ich bin Debuggen einer Reihe von Kernel-Modulen zusammenarbeiten.

Modul A ruft Funktionen von Modul B auf. An einem bestimmten Punkt in Funktion C von Modul A wird eine Benutzungszählung von Modul B ungültig. Ich habe determined, dass dies nicht in Funktion von Modul B geschieht. Ich möchte Debug verwenden Count von Modul B von C. Um dies zu tun, werde ich find_module() verwenden, um einen Zeiger auf B zu erhalten.

Antwort

1

würde ich vorschlagen, ein wenig defensiver in Ihrem Code zu sein:

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

modul_mutex wird vom Kernel in verschiedenen Operationen auf modu übernommen les. Alle von ihnen sind in /kernel/module.c und sind:

  • Wenn jedes Modul einzeln zu initialisieren, sowie alle Module (beim Booten, zum Beispiel).
  • Löschen eines Moduls
  • Warten, bis ein Modul von niemandem referenziert (verwendet) wird.
  • Wenn das Dateisystem/proc eine Liste von Modulen benötigt (oprofile und co. Nutzt dies).
  • Im TracePunk-Code; Iteration und Aktualisierung von Tracepoints.
0

1) Ja. Holen module_mutex in Ihrem Modul vor find_module() Aufruf

2) Es ist nicht außerhalb des Moduls Code verwendet

Beispiel:

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