Kernel Modul Problem

Post Reply
Message
Author
funkybooster

Kernel Modul Problem

#1 Post by funkybooster »

Hallo zusammen

Ich bin dabei ein Kernelmodul (für einen PCI Acclerator) zu kompilieren. Das Embedded-Linux-Zielsystem ist selbst gestrickt (mit Kernel 2.4.18, glibc, busybox, tinylogin).

Ich habe die Makefiles vom Kernelmodul so verbogen, dass die Pfade zu meinem Embedded-Linux-Kernel (Name: 2.4.18) zeigen und nicht zu den Sourcen dess Entwicklungsrechners (Name (SuSE Kernel): 2.4.18-4GB) zeigen. Mein Embeddedkernel hat Unterstützung für Module, bis jetzt habe ich aber kein "make modules" durchgeführt weil ich alle benötigten Treiber gerade in den Kernel hineinkompiliert habe. Das Modul für den PCI Acclerator fügt sich nicht in die Kernelsourcen ein sondern bringt eigene Makefles mit.
Das Modul wird einwandfrei kompliert. Versuche ich das Ding auf dem Embeddedrechner mit
#insmod <modulname.o>
zu laden, erscheint folgender Output:
insmod: unresolved symbol remap_page_range
insmod: unresolved symbol __wake_up
insmod: unresolved symbol printk
insmo.....
Das Modul wird also nicht geladen.

Versuche ich das Modul auf dem Entwicklungsrechner zu laden wird mir gesagt, dass die Versionen (Modul für 2.4.18 aber Kernel 2.4.18-4GB) nicht übereinstimmen. Finde ich OK.
Ein
#insmod -f <modulname.o>
bricht dann in init_module mit der Meldung ab, dass keine Karte gefunden wurde. Das stimmt auch, also OK.

Ein
#nm <modulname.o> | grep printk
liefert
U printk

Eigendlich habe ich hinten eine Zahl erwartet. Aber jedoch scheint das Modul auf dem Entwicklungsrechner doch zu funktionieren (da erst in init_module abgebrochen wird).

Meine Frage:
o Weshalb scheint das Ding auf dem Entwickungsrechner geladen zu werden (keine unresolved symbols) und auf dem Embedded Rechner nicht?
o Wieso spuckt nm keine Zahl aus?
o Was für Voraussetzungen müssen erfüllt sein, dass ich erfolgreich ein Modul laden kann?
o Woher kriegt der Linker die Info, wo die Funktionen (wie prinkt....) zu finden sind?
o Was kann ich noch probieren/überprüfen?

Vielen Dank

David

Jochen

Re: Kernel Modul Problem

#2 Post by Jochen »

Aus Deiner Schilderung heraus kann ich nur ein mögliches Problem erkennen. Nur ist das so eine simple Sache, dass Du wahrscheinlich selbst schon daran gedacht hast:

Wenn der Embedded-Kernel alle Treiber fix im Kernel eingebunden hat - hast Du dann die Modul-Untterstützung überhaupt aktiviert? "Kernel Module Loader" (kmod, CONFIG_KMOD) und "Set version information on all module symbols" (CONFIG_MODVERSIONS) sind nicht notwendig, aber "Enable loadable module support" (CONFIG_MODULES) muss schon aktiv sein. Dass printk() beim Laden nicht als Symbol gefunden werden kann, scheint ein Hinweis in diese Richtung zu sein.

Vielleicht hilft's ja ein bisschen.

Jochen

tj

Re: Kernel Modul Problem

#3 Post by tj »

Hi,

soweit ich das verstehe, fehlt in deinem embedded Kernel was (die unresolved symbols) um das modul zu laden.

Ist dein PCI Acclerator modul das einzige? Wenn ja, bringt dich modprobe ja auch nicht weiter...

Ich wuerde den Kernel-sourcecode mal nach der definition von z.B. remap_page_range durchgucken und sichergehen, dass das mitkompiliert wird.

Viel Glueck, tj

funkybooster

Re: Kernel Modul Problem

#4 Post by funkybooster »

DIE LÖSUNG

Danke für Eure Antworten. Das Problem lag an der Einstellung CONFIG_MODVERSIONS. Der Entwicklungspckernel hatte die Einstellung "n" und der Embeddedkernel die Einstellung "y". Beim kompilieren wurde auf die Einstellungen des Entwicklungspckernels gegriffen (obwohl ich meinte, alle Pfade im Makefile anzupassen an den Embeddedkernel....). Die Lösung: Embeddedkernel auch mich CONFIG_MODVERSIONS kompilieren....

Merci & Tschüss

fb

Post Reply