Come faccio a testare il mio driver viene caricato, e quindi accedere le mie funzioni dei driver dal kernel di Linux?

StackOverflow https://stackoverflow.com/questions/1693575

Domanda

Ho un autista che compila e carica nel kernel Linux più che bene. In questo driver sono alcune funzioni che vorrei accedere dal file del kernel 'fs / readdir.c'. Inoltre, come posso verificare se un driver viene caricato?

Ho bisogno di qualcosa simile alla seguente.

if(myDriver is loaded){
    myDriver.functionCall();
}

Tutti gli esempi che ho trovato su ricerche su Internet stanno facendo da applicazioni in userspace.

È stato utile?

Soluzione

L'altra possibilità è quella di utilizzare EXPORT_SYMBOL(functionCall); nel modulo che renderà la vostra funzione appare nella tabella dei simboli del kernel. È quindi possibile utilizzare find_symbol("functionCall", blah, blah) per verificare se esiste il simbolo e di trovare il suo valore / posizione in modo dinamico.

Vedere linux / kernel / module.c e module.h

Altri suggerimenti

fs/readdir.c non sarebbe collegare se il simbolo functionCall non è ancora nel kernel. Si può farlo solo attraverso indirezione. Setup qualche struttura ops nel codice del kernel principale, init a funzioni fittizie, o semplicemente NULLs per dire al resto del kernel che il driver non è ancora caricato. Nella routine di inizializzazione conducente impostare i puntatori a funzione in quella struttura per funzioni nel modulo (ripristinare le impostazioni predefinite in de-init). La struttura avrà bisogno di qualche forma di protezione gara, però, così si sarebbe probabilmente finire per avere un semaforo come uno dei suoi membri. Questo può essere ampliato per strutturare per dispositivo, ecc.

Si potrebbe aggiungere un puntatore a funzione per functionCall nel kernel, inizializzare a NULL, e attendere che il modulo per impostare il puntatore a un valore non nullo. Codice in readdir sarebbe controllare il puntatore essere non-NULL prima dereferencing esso. Ciò richiede il modulo di conoscere il puntatore a funzione nel kernel o facendo il puntatore globale, né parimenti facile accesso da un modulo.

Se non si desidera che il driver da sapere su questa modifica al kernel, è possibile modificare readdir per cercare il driver da caricare, quindi utilizzare find_symbol (come detto da @chrisharris) per ottenere l'indirizzo di functionCall, e assegnare il valore restituito a qualche puntatore a funzione privata da qualche parte in readdir.

Un modo per rispondere alla domanda "è il driver caricato" sarebbe quella di utilizzare register_module_notifier()

static int
my_load_notify(struct notifier_block *self, unsigned long val, void *data)
{
 struct module *m = data;
 if (0 == strcmp(m->name, "myDriver")) {
  // set function pointer(s)
 }
}
static struct notifier_block module_load_nb = {
 .notifier_call = my_load_notify,
};

static int
my_init(void)
{
 ...
 register_module_notifier(&module_load_nb);
 ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top