Unter Linux bezieht sich Firmware auf „Firmware“, ein Programm, das vom Hardwaregerät selbst ausgeführt wird und im Allgemeinen im Geräte-Flash gespeichert ist. In einem Linux-System befindet sich der Gerätetreiber im Kernel-Status, während sich die Firmware-Datei im Benutzerstatus befindet. Daher ist ein sicherer, stabiler und zuverlässiger Mechanismus erforderlich, um sicherzustellen, dass der Gerätetreiber die Firmware-Datei erfolgreich lädt.
Die Betriebsumgebung dieses Tutorials: Linux7.3-System, Dell G3-Computer.
Was ist Linux-Firmware?
Firmware ist ein Programm, das vom Hardwaregerät selbst ausgeführt wird. Firmware wird grundsätzlich im Geräte-Flash gespeichert. Aus Kosten- und Komfortgründen wird das laufende Programm des Hardwaregeräts normalerweise in eine Firmware-Datei in einem bestimmten Format gepackt, im Terminalsystem gespeichert und das Hardwaregerät wird über das Terminalsystem aktualisiert.
Während des Linux-Kernel-Entwicklungsprozesses debuggen Entwickler periphere Treibergeräte wie Touch-, Lade-, Linearmotoren, Speicher-, WIFI-Geräte usw. Es gibt auch Situationen, in denen die Firmware aktualisiert werden muss. In einem Linux-System befindet sich der Gerätetreiber im Kernel-Status, während sich die Firmware-Datei im Benutzerstatus befindet. Daher ist ein sicherer, stabiler und zuverlässiger Mechanismus erforderlich, um sicherzustellen, dass der Gerätetreiber die Firmware-Datei erfolgreich lädt.
Um das Problem zu lösen, dass Gerätetreiber Firmwaredateien im Benutzermodus stabil aus dem Kernelmodus laden, stellt das Linux-System ein Firmware-Subsystem bereit.
Einführung in den Prozess des Linux-Firmware-Subsystems
Das Linux-Firmware-Subsystem wird basierend auf sysfs- und uevent-Mechanismen implementiert.
Nachdem der Treiber die Firmware-Systemfunktionsschnittstelle aufgerufen hat, um Firmware zu beantragen, verwendet das Firmware-Subsystem den Firmware-Kompilierungskernel, um die Firmware abzurufen. Wenn die Erfassung fehlschlägt, wird der Firmware-Cache verwendet, um die Firmware abzurufen. Es wird der Standardpfad Kernel verwendet. Finden Sie die Firmware direkt. Wenn die Erfassung immer noch fehlschlägt, melden Sie die uevent-Nachricht an den Init-Prozess. Der Init-Prozess empfängt die uevent-Nachricht und filtert die Nachrichten heraus, deren Subsystemtyp Firmware ist. Der Init-Prozess sucht anhand der Firmware-Informationen, auf die in der uevent-Nachricht verwiesen wird, nach der Firmware und schreibt den erhaltenen Firmware-Inhalt über die von sysfs bereitgestellte Dateiknotenschnittstelle vom Benutzerstatus in den Kernel-Status, sodass der Treiber die Daten abrufen kann der Firmware-Datei.
Das Linux-Firmware-System bietet verschiedene Methoden zum Abrufen von Firmware-Dateien in verschiedenen Szenarien.
1) Methode zum direkten Kompilieren in den Kernel;
2) Methode zur direkten Angabe des Pfads entsprechend dem Kernel:
4) Methode zur Unterstützung der Verarbeitung durch den Init-Prozess;
Flussdiagramm des Linux-Firmware-SubsystemsHauptfunktionsschnittstelle des Linux-Firmware-Subsystems
Hauptfunktionsschnittstelle:
Die Haupttypen der Anwendungs-Firmware-Schnittstellen sind in synchrone und asynchrone unterteilt. Normalerweise ist der Prozess der Firmware-Beantragung zeitaufwändig, und der Prozess des Firmware-Upgrades ist zeitaufwändig. Daher kann er über eine asynchrone Funktionsschnittstelle implementiert werden oder zuerst eine Arbeitswarteschlange im Treiber erstellen und die synchrone Funktion aufrufen Funktionsschnittstelle, um es zu implementieren. Unter ihnen: Der Kernel beantragt Firmware-Dateien, indem er die Funktion request_firmware aufruft.Unter ihnen:
Die Schnittstelle „request_firmware_direct“ sucht nur nach Firmware im vom Kernel angegebenen Pfad und verwendet nicht den uevent-Mechanismus, um Firmware abzurufen.Bestimmen Sie anhand der Aktivierung des Makroschalters CONFIG_FW_LOADER zunächst, ob die Firmware-Datei in den Kernel kompiliert ist, indem Sie die Funktion fw_get_builtin_firmware aufrufen.
Dann rufen Sie die Funktion fw_lookup_and_allocate_buf auf, um festzustellen, ob die verknüpfte Liste in der globalen fw_cache-Struktur den Namen der aktuell angeforderten Firmware aufgezeichnet hat. Wenn der Name der aktuell angeforderten Firmware nicht vorhanden ist, wird der entsprechende Speicherplatz dynamisch zugewiesen und der Name der aktuell angeforderten Firmware zur verknüpften Liste in der globalen fw_cache-Struktur hinzugefügt.
fw_get_filesystem_firmware-Funktion
Verwendet hauptsächlich den vom Kernel bereitgestellten Standardpfad, um die Firmware-Datei zu finden, und ruft die Funktion kernel_read_file_from_path auf. Wenn die Firmware-Datei nicht gefunden wird, wird das Flag-Bit FW_OPT_USERHELPER verwendet, um zu bestimmen, ob der USER_HELPER-Modus aktiviert ist.
Unter ihnen:
Der Standardpfad im Firmware-System ist wie folgt:
Der Standardpfad kann über den Kernel übergeben werden. Um einen Pfad über die Befehlszeile hinzuzufügen, übergeben Sie ihn über die Schnittstelle module_param_string an den Variablenpfad, um den neuen Pfad anzupassen.
USER_HELPER-Modus
Diese Funktion wird erst nach dem Einschalten des Kernels unterstützt . Die Hauptfunktion besteht darin, uevent-Meldungen über den Kernel an den Init-Prozess zu melden, Firmware-Informationen über den Init-Prozess abzurufen und diese auf den zugrunde liegenden SYSFS-Knoten zu schreiben.
fw_load_from_user_helper-Funktion:
Rufen Sie zuerst die Funktion fw_create_instance auf, um das Gerätegerät, die Klassendatei und die Attributdatei zu erstellen und die Firmware_priv-Struktur zuzuweisen.
Anschließend wird unter /sys/class/firmware ein Verzeichnis erstellt, das den Gerätenamen als Verzeichnisnamen verwendet.
Dieses Verzeichnis enthält drei Attribute:
Laden:
ist auf 1 gesetzt: Dieses Attribut ist verantwortlich für Laden Der Benutzerbereich der Firmware wird zum Starten auf 1 gesetzt;
wird auf 0 gesetzt: wenn der Ladevorgang abgeschlossen ist;
wird auf -1 gesetzt: die Firmware Der Ladevorgang wird abgebrochen.
data:
wird zum Empfangen von Firmware-Daten verwendet. Nach dem Laden schreibt der User-Space-Prozess die Firmware in dieses Attribut.
device: Symbolischer Link zum entsprechenden Eintrag unter
/sys/devices.
Timeout:
Das standardmäßige maximale Timeout für die Anwendung von Firmware über uevent beträgt 60 Sekunden, und das Schreib-Timeout der oberen Ebene wird unterstützt.
_request_firmware_load-Funktion:
Deaktivieren Sie zunächst die uevent-Berichterstattung, fügen Sie das Gerät durch Aufrufen der Funktion „device_add“ hinzu und lösen Sie den Aufruf der Funktion „firmware_uevent“ aus. Geben Sie unter anderem das von uevent gemeldete Informationsformat ein, einschließlich des Namens der Firmware, des Timeout-Zeitraums und der Angabe, ob sie asynchron ist.
Der nächste Schritt besteht darin, die uevent-Berichtsfunktion zu aktivieren, gleichzeitig die Funktion kobject_uevent aufzurufen und den Aktionstyp „Hinzufügen“ an die obere Ebene zu melden ueventd.
Rufen Sie dann die Funktion fw_state_wait_timeout auf und warten Sie, bis die obere Schicht ueventd innerhalb des voreingestellten Timeout-Zeitraums verarbeitet wird.
Wenn die Zeitüberschreitung nach Erhalt des Abschlussbetrags erreicht oder aufwacht, wird der zuvor angewendete Speicher freigegeben und Speicherinformationen wie Gerät und Klasse werden freigegeben.
ueventd-bezogener Firmware-Verarbeitungsprozess
Ueventd ist ein wichtiges Modul im Init-Prozess. Es kümmert sich hauptsächlich um Selinux, die Erstellung von Entwicklungsgeräten und die Überwachung Kernel-Berichte, uevent-Meldungen, Firmware-Ladevorgänge usw.
FirmwareHandler-Verarbeitungsablauf:
Die HandleUevent-Methode in FirmwareHandler verwaltet hauptsächlich den Interaktionsprozess zwischen dem Laden der Firmware und den zugrunde liegenden Knoten.
Bestimmen Sie vor der Verarbeitung zunächst, ob der Subsystemtyp der uevent-Nachricht das Firmware-Feld ist. Dieser Typ wird nur vom Firmware-Modul im Kernel gemeldet.
HandleUevent erstellt hauptsächlich verschiedene Unterthreads über einen Hauptthread, um Firmware-Anfragen von verschiedenen Treibern aus dem Kernel parallel zu verarbeiten.
ProcessFirmwareEvent-Funktion
Die erste besteht darin, eine Schleife durchzuführen, um zu ermitteln, ob die Firmware-Datei, die im von ueventd unterstützten Pfad abgerufen wurde, vorhanden ist. Wenn vorhanden, schreiben Sie Geben Sie die zugrunde liegende Ladeattributdatei auf 1 ein, kopieren Sie die erhaltene Firmware-Datei und schreiben Sie sie in die zugrunde liegende Datendatei. Nach Abschluss wird 0 in die zugrunde liegende Ladeattributdatei geschrieben.
Zu diesem Zeitpunkt hat der Kernel die vom Benutzerbereich geschriebenen Firmware-Dateiinformationen erhalten.
Unter ihnen:
ueventd unterstützt standardmäßig den Pfad zur Suche nach Firmware:
von ueventd.rc Das in der Datei angegebene Firmware-Verzeichnis.
Verwandte Empfehlungen: „Linux-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonWas ist Linux-Firmware?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!