2010-07-20 32 views
6

Jak korzystać z funkcji jądra Linux find_module()? Dokumentacja mówi "must hold module_mutex".Jak korzystać z find_module?

  1. Czy to znaczy, że powinienem nabyć zamkiem w moim kodu modułu przed poszukiwania wskaźnika do drugiego?
  2. Kiedy ten muteks jest zablokowany przez inny niż moduł kod ?

Kontekst

Jestem debugowania zestaw modułów jądra współpracy.

Moduł Funkcje wywołania modułu B. W pewnym momencie w funkcji C modułu A licznik użycia modułu B jest nieważny. Mam determined, że nie dzieje się to w funkcji modułu B. Chciałbym debugować wykorzystanie liczby modułów B z C. Aby to zrobić zamierzam użyć find_module(), aby uzyskać wskaźnik do B.

Odpowiedz

1

Proponuję jest trochę bardziej defensywny w kodzie:

#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 jest nabywany przez jądro w różnych operacjach na modułach les. Wszystkie z nich są w /kernel/module.c a to:

  • Przy inicjalizacji każdy moduł z osobna, jak również wszystkie moduły (przy starcie, na przykład).
  • Usuwanie modułu
  • Oczekiwanie, aż nikt nie odwołał się (użył) modułu.
  • Gdy system plików/proc potrzebuje listy modułów (oprofile i co. Używa tego).
  • W kodzie powiązanym z tracepotem; iterowanie i aktualizowanie punktów śledzenia.
0

1) Tak. Uzyskaj module_mutex w module przed wywołaniem find_module()

2) To nie jest używany poza kodu modułu

Przykład:

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