2010-07-20 27 views
6

¿Cómo se usa la función find_module() del kernel de Linux? La documentación dice "debe contener module_mutex".¿Cómo se usa find_module?

  1. ¿Eso quiere decir que debería adquirir un bloqueo en mi código de módulo antes de la búsqueda de un puntero a otro?
  2. Cuando este mutex está bloqueado por código de núcleo no modular?

Contexto

estoy depuración de un conjunto de módulos del núcleo que trabajan juntos.

Módulo A funciones de llamada del módulo B. En algún punto de la función C del módulo A, el recuento de usos del módulo B no es válido. Tengo determined que esto no está sucediendo en función del módulo B. Me gustaría depurar el conteo de uso del módulo B de C. Para hacer esto, voy a usar find_module() para obtener un puntero a B.

Respuesta

1

Yo sugeriría ser un poco más a la defensiva en el código:

#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 es adquirido por el kernel en varias operaciones en modu les. Todos ellos se encuentran en /kernel/module.c y son:

  • Al inicializar cada módulo individual, así como todos los módulos (en el arranque, por ejemplo).
  • Eliminación de un módulo
  • Esperando hasta que un módulo sea referenciado (utilizado) por nadie.
  • Cuando el sistema de archivos/proc necesita una lista de módulos (oprofile y co. Utilizan esto).
  • En código relacionado con punto de rastreo; iteración y actualización de puntos de referencia.
0

1) Sí. Obtener module_mutex en el módulo antes de llamar find_module()

2) No se usa fuera del código del módulo

Ejemplo:

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