Wie können wir die Ladereihenfolge der integrierten Treiber anpassen (um zuerst ein eingebautes Treibermodul und später das abhängige Modul laden zu lassen)?Was ist die integrierte Treiberladefolge von Linux?
Antwort
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?
- setzen Sie Ihre init-Funktion in der höheren Ebene oder
- 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.
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.
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
- 1. Was ist Linux-Äquivalent von LPTSTR & LPCSTR?
- 2. Was ist Unix/Linux Interna?
- 3. In den benutzerdefinierten Linux-Kernel integrierte Initiamfs läuft nicht
- 4. Was sind integrierte Bezeichner in Python?
- 5. Was ist Linux analog zu WIN32_FIND_DATA Struktur
- 6. Was die wahre Methode für JFrame ist, es in Linux
- 7. was das Ergebnis dieser Linux-Befehl ist
- 8. Was ist platform_get_resource im Linux-Treiber?
- 9. Was ist das Linux-Äquivalent von: MultiByteToWideChar & WideCharToMultiByte?
- 10. Was ist das Linux-Äquivalent von Kernel32.dll?
- 11. Was ist die Genauigkeit von scheduleAtFixedRate?
- 12. Ist die integrierte Animation für langsame langsame Animationen geeignet?
- 13. was ist das cygwin/Windows-Äquivalent von Linux 'notify-send
- 14. Was ist rc.status Datei in Linux
- 15. Was ist ein anonymer Inode in Linux?
- 16. Was ist das Linux-Äquivalent zu MAXDWORD?
- 17. Warum ist die integrierte LM-Funktion in R so langsam?
- 18. Was ist eine angemessene Menge von inotify Uhren mit Linux?
- 19. Was ist die Verwendung von "??"
- 20. ist ESlint integrierte Validierung für ES6 ausreichend?
- 21. Was ist die integrierte JavaScript-Funktion, um den Validator-Status in asp.net
- 22. Gibt es eine integrierte JavaScript-Funktion, die os.path.join ähnlich ist?
- 23. Spark - Ist die integrierte Funktion rdd.count() in einem Cluster zuverlässig?
- 24. Precise Linux Timing - Was bestimmt die Auflösung von clock_gettime()?
- 25. Was ist die Absicht von waitpid
- 26. Was ist die CMake-Installationszeit?
- 27. Integrierte Promotion
- 28. Was bedeuten die Wörter im Terminal von Linux?
- 29. Was sind die Pakete für Linux-Bibliotheken?
- 30. 'MOD' ist keine anerkannte integrierte Funktion Name
Vielen Dank @ Yasushi Shoji für Ihre sehr detaillierte Erklärung! –
Dies ist ein Beispiel für eine ausgezeichnete Antwort! – VividD