2012-07-25 10 views

Antwort

29

Eingebaute Treiber werden nicht geladen, daher eingebaut. Ihre Initialisierungsfunktionen werden aufgerufen und die Treiber werden aktiviert, wenn der Kernel sich selbst aufruft. Diese Init-Funktionen werden in init/main.c::do_initcalls() aufgerufen. Alle Init-Aufrufe sind in Ebenen eingeteilt, die in und include/linux/init.h

definiert sind. Diese Ebenen sind im Linker-Skript definierte aktive Symbole (arch/*/kernel/vmlinux.lds.*). Zur Kernel-Kompilierzeit sammelt der Linker alle mit module_init() oder anderen *_initcall() gekennzeichneten Funktionen, klassifiziert in Ebenen, fügt alle Funktionen auf derselben Ebene an derselben Stelle zusammen und erstellt wie ein Array von Funktionszeigern.

Was do_initcall_level() in der Laufzeit ist, ruft jede Funktion auf, auf die die Zeiger im Array zeigen. In do_initcall_level gibt es keine Aufruf-Policy außer den Ebenen, aber die Reihenfolge im Array wird in der Verbindungszeit festgelegt.

So, jetzt können Sie sehen, dass die Initiierungsreihenfolge des Treibers zur Verbindungszeit festgelegt ist, aber was können Sie tun?

  1. setzen Sie Ihre init-Funktion in der höheren Ebene oder
  2. setzen Sie Ihren Gerätetreiber in der höheren Position in Makefile

Die erste ist klar, wenn man die oben gelesen habe. ie) verwende stattdessen early_initcall(), wenn es angemessen ist.

Die zweite benötigt ein bisschen mehr Erklärung. Der Grund, warum die Reihenfolge in einer Makefile Angelegenheit ist, wie das aktuelle Kernel-Build-System funktioniert und wie die Linker funktioniert. Um es kurz zu machen, das Buildsystem nimmt alle Objektdateien in obj-y und verbindet sie miteinander. Es ist stark abhängig von der Umgebung, aber es gibt eine hohe Wahrscheinlichkeit, dass der Linker die erste Objektdatei in der obj-y in der niedrigeren Adresse platziert, also früher aufgerufen wird.

Wenn Sie möchten, dass Ihr Treiber früher als andere Treiber im selben Verzeichnis aufgerufen wird, ist dies der einfachste Weg.

+0

Vielen Dank @ Yasushi Shoji für Ihre sehr detaillierte Erklärung! –

+0

Dies ist ein Beispiel für eine ausgezeichnete Antwort! – VividD

0

Korrekte Modulreihenfolge und Abhängigkeiten werden von modprobe behandelt, selbst innerhalb der initrd.

2

depmod untersucht die von jedem Modul exportierten und benötigten Symbole und führt eine topologische Sortierung durch, die modprobe später verwenden kann, um Module in der richtigen Reihenfolge zu laden. Die Symbole von Modulen zu benötigen, von denen Sie abhängig sein möchten, reicht aus, um das Richtige zu tun.

0

Vor kurzem bekam ich dieses Problem mein Ladegerät Treiber hat Abhängigkeit von ADC-Treiber, also vor dem Laden ADC Treiberladegerät Treiber geladen und auf ADC Phandle, die in DTS-Datei definiert ist und muss durch ADC-Treiber initialisieren. Es wurde gelöst durch Ändern der Reihenfolge des Moduls in Treibern/Makefile

Verwandte Themen