2015-11-06 5 views
5

Von <linux/module.h>:Wo ist die Speicherbelegung der Variable "__this_module"?

#ifdef MODULE 
#define MODULE_GENERIC_TABLE(gtype,name)   \ 
extern const struct gtype##_id __mod_##gtype##_table  \ 
    __attribute__ ((unused, alias(__stringify(name)))) 

extern struct module __this_module; 
#define THIS_MODULE (&__this_module) 
#else /* !MODULE */ 
#define MODULE_GENERIC_TABLE(gtype,name) 
#define THIS_MODULE ((struct module *)0) 
#endif 

kann ich "extern struct module __this_module;" ist nur eine Erklärung von __this_module, aber nicht Definition von __this_module sehen. Also wo ist die Speicherbelegung von __this_module? Ich kann es nicht in kernel Code finden.

Antwort

4

Nach an obscure and dark spot in the LKML ...

Bedeutet dies, dass die Modulstruktur (struct-Modul) und es ist verschiedene ubstructures werden von insmod ausgefüllt?

Grüße, Naren

On Sun, 5. November 2000, Tigran Aivazian schrieb:

On Sun, 5. November 2000, Naren Devaiah schrieb: > >

Ich habe in der Source-Struktur 2.4.0-pre10 nachgesehen und festgestellt, dass es als extern struct module __this_module definiert ist; in module.h (neben anderen Dateien), aber wo ist es eigentlich definiert?

ist es nicht - es ist Magie, natürlich :). Die Art, wie es funktioniert, ist für insmod zu Dinge so arrangieren, dass & __this_module auf den Anfang des Adressraums des Moduls auflöst, der zu Beginn "struct Modul" enthält.

Grüße, Tigran

Follow-up ...

On Sun, 5. November 2000, schrieb Naren Devaiah:

Bedeutet dies, dass die Modulstruktur (Strukturmodul) und es ist verschiedene Unterstrukturen werden von Insmod ausgefüllt? nur

Grüße, Naren

Ja, teilweise, also einen Blick auf sys_create_module haben() und sys_init_module() Systemaufrufe, sie sind in kernel/module.c

sys_create_module() reserviert den Platz und verknüpft das Modul mit der Liste, aber sys_init_module() wird ein 'struct module' aus dem Benutzerbereich übergeben, dessen Inhalt streng geprüft ist (niemand vertrauen!) und dann in ein reales Kernel 'struct Modul' und Modul 'init_module' installiert wird() Routine ist aufgerufen.

Grüße, Tigran