Heim > Artikel > System-Tutorial > Ein Blick in die Linux-Kernel-Hierarchie: ein Blick von der Spitze des Berges
Sie alle wissen, dass es in vielen Artikeln von Yuanlijun um die Funktionen des Linux-Kernels geht. Basierend auf dem Prinzip der öffentlichen Konten sprechen wir nur über Prinzipien und wandeln komplexe Codes in leicht verständliche Texte und Bilder um. Endlich präsentiert. Man kann sagen, dass Herr Yuanli die Linux-Kernel-Architektur nie systematisch aus einem großen Framework für Sie herausgesucht hat. Dann besteht der Zweck dieses Artikels darin, auf dem Gipfel des Berges zu stehen und nach oben zu schauen.
Hierarchisches Framework des Linux-Systems
Aus dem Bild können wir es in zwei Ebenen unterteilen:
Benutzerbereich Kernelbereich
Auf der untersten Ebene befindet sich der Benutzerbereich, in dem die Anwendung ausgeführt wird. Die obere Ebene des Benutzerbereichs ist die häufig verwendete GBLIC-Bibliothek für die Linux-Speicherverwaltung. Ihre Funktion besteht darin, den Systemaufruf-Socket zu kapseln. Es ist eine sehr unkluge Entscheidung, eine große Anzahl von Systemaufruf-Sockets direkt zu verwenden, ohne die GBLIC-Bibliothek zu verwenden. Prozesse, die im Benutzerbereich ausgeführt werden, verfügen jeweils über einen eigenen virtuellen Adressraum, während der Kernel über einen separaten Adressraum verfügt.
Die obere Schicht ist der Kernelraum. Der Linux-Kernelraum ist in drei Schichten unterteilt:
Systemaufrufschicht; sie gehört zur untersten Schicht und bietet eine Form der Kommunikation zwischen Benutzerraum und Kernelraum. Linux-Kernel: Genauer gesagt ist es der Kernel-Code, der von der Architektur unabhängig ist. Dieser universelle Code ist auf jede Architektur anwendbar. Architekturabhängiger Code: Dieser Teil wird im Allgemeinen als BSP bezeichnet. Diese Art von Code wird hauptsächlich eingeführt, um mit verschiedenen Plattformen oder Prozessoren kompatibel zu sein.
Der Linux-Kernel implementiert viele wichtige Architektureigenschaften. Auf einer höheren oder niedrigeren Ebene wird der Kernel in Subsysteme unterteilt. Linux kann auch als Ganzes betrachtet werden, da es alle diese Basisdienste in den Kernel integriert. Dies unterscheidet sich von der Mikrokernel-Architektur. Erstere stellt einige grundlegende Dienste bereit, z. B. Kommunikation, E/A, Speicher und Prozessverwaltung, und spezifischere Dienste werden in die Mikrokernel-Schicht eingefügt. Jeder Kernel hat seine eigenen Vorteile, auf die hier jedoch nicht eingegangen wird.
Im Laufe der Zeit ist der Linux-Kernel hinsichtlich Videospeicher und CPU-Auslastung effizienter geworden und sehr stabil. Und das Interessanteste an Linux ist, dass es trotz seiner Größe und Komplexität immer noch gut portierbar ist. Linux ist so kompiliert, dass es auf einer großen Anzahl von Prozessoren und Plattformen mit unterschiedlichen architektonischen Einschränkungen und Anforderungen läuft. Ein Gegenbeispiel ist, dass Linux auf einem Prozessor laufen kann, der über eine Grafikspeicherverwaltungseinheit (MMU) verfügt, oder auf Prozessoren, die über keine MMU verfügen. Der uClinux-Port des Linux-Kernels bietet Unterstützung für Nicht-MMUs.
Linux-Kernel-Architektur
Die Hauptkomponenten des Linux-Kernels sind:
Systemaufruf-Socket-Prozessverwaltung, Videospeicherverwaltung, virtuelles Dateisystem, Netzwerkstapel, Gerätetreiber und Codes für die Hardwarearchitektur.
(1) Systemanruf-Socket
Die Systemaufrufschicht bietet individuelle Mechanismen zur Durchführung von Funktionsaufrufen vom Benutzerbereich an den Kernel. Es ist architekturabhängig. Auf dieser Ebene werden Multiplex- und Demultiplex-Dienste bereitgestellt.
(2) Prozessmanagement
Der Kern des Prozessmanagements ist die Prozessplanung. Im Linux-Kernel ist die Einheit der Prozessplanung der Prozess, und Threads entsprechen dem Konzept des Prozesses für die Planung. Der Kernel stellt über Systemaufrufe Anwendungsprogrammier-Sockets bereit. Zum Beispiel: Erstellen neuer Prozesse (Fork, Exec), Beenden von Prozessen (Kill, Exit) und Bereitstellen von Kontrollprozessen, Linux-Kernel-Transplantationsschritten, Sockets zum Synchronisieren von Prozessen und Kommunikation zwischen Prozessen. Zur Prozessverwaltung gehört auch die Bewältigung der Notwendigkeit, die CPU zwischen aktiven Prozessen zu teilen. Der Kernel nutzt den CFS Completely Fair Scheduler, der in meinem vorherigen Artikel „Linux Completely Fair Scheduler CFS“ ausführlich erläutert wird.
(3) Videospeicherverwaltung
Eine weitere wichtige vom Kernel verwaltete Ressource ist der Videospeicher. Ein weiterer Artikel von Yuanlijun, „Understanding Linux Video Memory Management, This Only Article“, erklärt die Linux-Videospeicherverwaltung ausführlich. Um die Effizienz zu verbessern, wird das Konzept des virtuellen Videospeichers eingeführt. Der Videospeicher wird gemäß der sogenannten Videospeicherseitenform verwaltet (normalerweise beträgt die Seitengröße des Videospeichers 4 KB und 8 KB, die meisten davon sind 4 KB). Zusätzlich zu den Linux-Methoden zur Verwaltung des verfügbaren Videospeichers gibt es Hardwaremechanismen für mathematische und virtuelle Zuordnungen. Allerdings muss die Videospeicherverwaltung mehr als nur den 4-KB-Puffer verwalten. Linux bietet eine konkrete Darstellung des 4-KB-Puffers, beispielsweise den Slab Allocator. Diese Speicherverwaltungsmodi verwenden einen 4-KB-Puffer als Basis, weisen daraus dann Strukturen zu und verfolgen die Speicherseitennutzung, z. B. welche Speicherseiten voll sind, welche Seiten nicht vollständig genutzt werden und welche Seiten leer sind. Dadurch kann der Modus die Videospeichernutzung dynamisch an die Systemanforderungen anpassen. Um die Nutzung des Videospeichers durch mehrere Benutzer zu unterstützen, wird manchmal der verfügbare Videospeicher verbraucht. Aus diesem Grund können Seiten aus dem Videospeicher verschoben und auf dem Laufwerk C abgelegt werden. Dieser Vorgang wird als Swapping bezeichnet, da die Seiten vom Videospeicher auf die Festplatte ausgelagert werden. Der Quellcode für die Videospeicherverwaltung ist in ./linux/mm zu finden.
(4)Virtuelles Dateisystem
Das Virtual File System (VFS) ist ein sehr nützlicher Aspekt des Linux-Kernels, da es eine universelle Schnittstellendarstellung für das Dateisystem bietet. VFS bietet einen Schutzschild zwischen Systemaufrufen und vom Kernel unterstützten Dateisystemen. Wie im Bild rechts gezeigt:
In VFS handelt es sich um eine gängige API-Darstellung von Funktionen wie Öffnen, Schließen, Lesen und Schreiben. Unter VFS versteht man die Dateisystemdarstellung, die die Implementierungsmethode der untergeordneten Funktionen definiert. Es handelt sich um Plugins für ein bestimmtes Dateisystem (mehr als 50 davon). Der Quellcode für das Dateisystem ist in ./linux/fs zu finden. Unterhalb der Dateisystemschicht befindet sich der Puffercache, der einen gemeinsamen Satz von Funktionen für die Dateisystemschicht bereitstellt (unabhängig vom jeweiligen Dateisystem). Diese Caching-Schicht optimiert den Zugriff auf chemische Geräte, indem sie Daten für einen bestimmten Zeitraum speichert (oder die Daten später vorab abruft, um sie bei Bedarf verfügbar zu machen). Unter dem Puffercache befinden sich Gerätetreiber, die Sockets für bestimmte chemische Geräte implementieren.
(5) Netzwerkvertragsstapel
Der Netzwerkvertragsstapel ist so konzipiert, dass er der mehrschichtigen Architektur des simulierten Vertrags selbst folgt. Erinnern Sie sich an die
Linux-Kernel-Transplantationsschritte: InternetProtocol (IP) ist der Kernvertrag der Netzwerkschicht unter dem Übertragungsvertrag (allgemein bekannt als Übertragungskontrollvertrag oder TCP). Innerhalb von TCP befindet sich die Socket-Schicht, die über die Systemaufrufschicht aufgerufen wird. Die Socket-Schicht ist die Standard-API des Netzwerksubsystems, die einen Benutzer-Socket für verschiedene Netzwerkverträge bereitstellt. Vom Raw-Frame-Zugriff über IP Contract Data Units (PDUs) bis hin zu TCP und User Datagram Protocol (UDP) bietet die Socket-Schicht eine standardisierte Möglichkeit, Verbindungen zu verwalten und Daten zwischen verschiedenen Endpunkten zu kommunizieren. Der Netzwerkquellcode im Kernel befindet sich in ./linux/net. (6) Gerätetreiber Eine große Menge Code im Linux-Kernel befindet sich in Gerätetreibern, die bestimmte Hardwaregeräte ausführen können. Der Linux-Quellbaum stellt ein Treiber-Unterverzeichnis bereit, das weiter nach verschiedenen unterstützten Geräten wie Bluetooth, I2C, seriell usw. definiert ist. Den Code für den Gerätetreiber finden Sie in ./linux/drivers. (7) Architekturabhängiger Code Obwohl Linux weitgehend unabhängig von der Architektur ist, auf der es läuft, gibt es Elemente, die berücksichtigt werden müssen, damit die Architektur ordnungsgemäß funktioniert und eine höhere Effizienz erzielt. Das Unterverzeichnis ./linux/arch definiert die architekturabhängigen Teile des Kernel-Quellcodes, der verschiedene architekturspezifische Unterverzeichnisse enthält (die zusammen das BSP bilden). Für ein typisches Desktop-System wird das x86-Verzeichnis verwendet. Jedes Architektur-Unterverzeichnis enthält viele andere Unterverzeichnisse, und jedes Unterverzeichnis konzentriert sich auf einen bestimmten Aspekt des Kernels, z. B. Booten, Kernel, Speicherverwaltung usw. Dieser architekturabhängige Code ist in ./linux/arch zu finden. Linux ist auch ein dynamischer Kernel, der das dynamische Hinzufügen oder Löschen von Softwarekomponenten unterstützt. Sie werden als dynamisch ladbare Kernelmodule bezeichnet und können bei Bedarf beim Booten (das Modul wird derzeit für ein bestimmtes Gerät benötigt) oder jederzeit vom Benutzer eingefügt werden. Referenz Genri-kun hat auf diesen Artikel verwiesen
Das obige ist der detaillierte Inhalt vonEin Blick in die Linux-Kernel-Hierarchie: ein Blick von der Spitze des Berges. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!