Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Abhängigkeit eines Modul festlegen

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.11.2006
    Beiträge
    19

    Question Abhängigkeit eines Modul festlegen

    Hallo zusammen,

    ich habe ein folgendes Problem. Ich habe selbst 2 Module programmiert z.B, Modul A und B. Modul B hängt von A ab. bzw. in A sind Funktionen definiert und in B werden diese aufgerufen.

    Kompillier- und Ladevorgang bei A laufen gut. Und B kann kompilliert werden aber nicht geladen (inserting error Unknown symbol in module) werde.
    Mit dmesg werden alle Namen von diesen Funktionen, die in A definiert sind, aufgelistet.

    Wie kann ich eine Abhängigkeit bei Modul definieren?


    Danke
    Svetlana

  2. #2
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Hallo,

    du musst für jede Funktion, die ein Modul nach außen geben soll ein EXPORT_SYMBOL machen. Sonst sind diese Funktionen für andere Module nicht sichtbar. Dieses Makro ist definiert in module.h

    Beispiel:

    Code:
    int function(int dummy) {
      return 0;
    }
    EXPORT_SYMBOL(function);
    Nun kann jedes andere Modul diese Funktion aufrufen.
    Mit dieser Funktion ist aber auch Vorsicht geboten, weil man hier super verzahnte Module schreiben kann, durch die später keiner mehr durchblickt. Dann lieber ne saubere API mit Funktionspointern und nur die register und release Funktion mit EXPORT_SYMBOL sichtbar machen (Beispiel siehe CHAR-Device API).
    EXPORT_SYMBOL bewahrt dich nicht davor, die Funktionen für das Modul das sie verwenden soll als Prototype anzugeben. Dies sollte natürlich in einem passenden Header geschehen.

    Gruß

    almoeli

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.11.2006
    Beiträge
    19
    Hallo almoeli,

    vielen Dank für deine Hilfe.

    Gilt es auch für eine main-Funktion, die diese in einem Modul geschriebene Funktionen, aufruft?

    Danke
    svetlana

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Was meinst du genau mit main Funktion?
    Die init Funktion des Moduls?

    EXPORT_SYMBOL wird nicht benötigt, wenn sich Funktionen alle in einem Modul befinden und quasi nur Modul intern aufgerufen werden.
    Auch wenn sich dein Modul (.ko Datei) aus mehreren .c bzw. .o Dateien zusammensetzt brauchst du kein EXPORT_SYMBOL um eine Funktion aus einer anderen .c Datei desselben Moduls aufzurufen.

    Gruß

    almoeli

  5. #5
    Registrierter Benutzer
    Registriert seit
    09.11.2006
    Beiträge
    19
    Ich habe es so gemeint:

    Wenn z.B. ein Modul übersetzt und geladen ist und es eine C-Datei mit main-Funktion gibt. Diese main-Funktion ruft die Funktionen auf, die in diesem Modul beschriben sind.
    Oder ist es überhaupt nicht möglich so eine Kommunikation zwischen Kernel- und User-Space zu realisieren.


    Noch eine zusätziche Frage:
    Wenn ein Modul aus mehreren .c besteht. Soll ich zuerst diese .c mit gcc -c übersetzen und dann in Makefile nach all: Objektdateien eingeben.
    z.B.
    gcc -c modulteil1.c -o modulteil1.o
    gcc -c modulteil2.c -o modulteil2.o

    und dann mit make folgendes Makefile aufrufen

    ifneq ($(KERNELREALEASE),)
    obj-m := modul.o
    else
    KDIR:=/lib/modules/$(shell uname -r)/build
    PWD:=$(shell pwd)

    all: modulteil1.o, modulteil2.o
    (TAB) $(MAKE) -C $(KDIR) M=$(PWD) modules

    endif

    und anschliessend mit insmod ./modul.ko laden.


    Funktioniert es so?

    Danke für deine Mühe
    Svetlana

  6. #6
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Es ist nicht möglich Funktionen eines Kernelmoduls direkt aus einem Programm des User Space aufzurufen. Hier musst du über einen anderen Mechanismus gehen. Schnittstellen gibt es gar viele. Character Device anmelden und über ioctl die Funktionausfrufe implementieren. Werden nur Ausgaben aus dem Kernel benötigt, so kann man im /proc Dateisystem eine entsprechende Datei hinterlegen.

    Ein Makefile könnte z.B. so ausehen:

    Code:
    obj-m := module.o
    module-objs := modulteil1.o modulteil2.o
    
    KDIR := /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
    
    default:
            $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
    Dieses Makefile macht dir aus modulteil1.c und modulteil2.c das Modul module.ko. Alle Regeln, um die .c in .o zu überführen liefert das Makefile des Kernels. Deshalb wird der make auch mit -C in die Kernelsourcen aufgerufen.

    Gruß

    almoeli

  7. #7
    Registrierter Benutzer
    Registriert seit
    09.11.2006
    Beiträge
    19
    Danke almoeli,

    du hast sehr geholfen.

    Das heisst, eine main-Funktion wird den Inhalt dieser Datei aus /proc einlesen und ausgeben und irgendwelche Eingaben in Userspace in diese Datei schreiben, die z.B. init_module (die Änderungen) einliest und entsprechend reagiert?

    Gruß
    svetlana

  8. #8
    Registrierter Benutzer
    Registriert seit
    16.06.2003
    Beiträge
    73
    Die /proc (spezieller eigentlich /proc/sys) Schnittstelle ist eher dafür gedacht einzelne Werte bzw. Einstellungen zwischen Kernel und Userspace auszutauschen. Eine komplette Kommunikationsschnittstelle darüber zu implementieren ist zwar möglich aber meiner Meinung nach nicht sinnvoll.
    Für komplexere Schnittstellen bietet sich ein Character Device mit read/write Funktionalität und ioctl Aufrufen an.

    Gruß

    almoeli

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •