Sie könnten einen Funktionszeiger auf functionCall
im Kernel hinzufügen, initialisieren Sie ihn mit NULL und warten Sie darauf, dass das Modul den Zeiger auf einen nicht NULL-Wert setzt. Der Code in readdir würde überprüfen, ob der Zeiger nicht NULL ist, bevor er ihn dereferenziert. Dafür muss das Modul über den Funktionszeiger im Kernel Bescheid wissen, indem der Zeiger global gemacht wird oder ähnlich einfach aus einem Modul erreichbar ist.
Wenn der Treiber nichts von dieser Änderung am Kernel wissen soll, könnten Sie readdir ändern, um nach dem Treiber zum Laden zu suchen, dann find_symbol
verwenden (wie von @chrisharris erwähnt), um die Adresse von functionCall
zu erhalten, und den zurückgegebenen Wert einem privaten Funktionszeiger irgendwo in readdir zuzuweisen.
Eine Möglichkeit, die Frage "Ist der Treiber geladen" zu beantworten, wäre die Verwendung von 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);
...
}