Dieser Artikel vermittelt Ihnen relevantes Wissen über den Kernel-Quellcode der fünf Hauptmodule von Linux, einschließlich Fragen im Zusammenhang mit dem gesamten Architekturdesign des Kernels. Ich hoffe, dass er für alle hilfreich ist.
Verwandte Empfehlungen: „Linux-Video-Tutorial“
Dieser Artikel ist ein professioneller Teil der Reihe „Linux-Kernel-Quellcode-Analyse“. Der Ausgangspunkt ist die Beschreibung der Gesamtarchitektur des Linux-Kernels sowie der wichtigsten Software-Subsysteme unter der Architektur. Anschließend wird die Verzeichnisstruktur der Linux-Kernel-Quelldateien eingeführt, die jedem Software-Subsystem entspricht.
Hinweis: Dieser Artikel und andere Artikel zur „Linux-Kernel-Analyse“ basieren auf der folgenden Konvention:
a) Die Kernel-Version ist Linux 5.6.18, die über den folgenden Link bezogen werden kann:
https://mirrors.edge .kernel.org/ pub/linux/kernel/v5.x/linux-5.6.18.tar.xz
b) Da die meisten eingebetteten Systeme ARM-Prozessoren verwenden, werden die Inhalte im Zusammenhang mit dem Architekturteil alle mit ARM
Wie in der folgenden Abbildung dargestellt, ist der Linux-Kernel nur ein Teil des Linux-Betriebssystems. Auf der unteren Seite verwaltet es alle Hardwaregeräte des Systems; auf der anderen Seite stellt es über Systemaufrufe Schnittstellen zu Bibliotheksroutinen (z. B. C-Bibliothek) oder anderen Anwendungen bereit.
Daher besteht seine Kernfunktion darin: Hardwaregeräte zur Verwendung durch Anwendungen zu verwalten. Die Standardkomponenten moderner Computer (ob PCs oder eingebettete Systeme) sind CPU, Arbeitsspeicher (Arbeitsspeicher und externer Speicher), Ein- und Ausgabegeräte, Netzwerkgeräte und andere Peripheriegeräte. Um diese Geräte zu verwalten, schlägt der Linux-Kernel die folgende Architektur vor.
(Code ist kostenlos, um die private Hintergrundnachricht [Code] zu erhalten)
3.1 Gesamtarchitektur und Subsystemaufteilung
Die obige Abbildung zeigt die Gesamtarchitektur des Linux Kernel. Entsprechend den Kernfunktionen des Kernels bietet der Linux-Kernel 5 Subsysteme, die für die folgenden Funktionen verantwortlich sind:
1. Prozessplaner, auch Prozessmanagement und Prozessplanung genannt. Verantwortlich für die Verwaltung der CPU-Ressourcen, damit jeder Prozess auf möglichst faire Weise auf die CPU zugreifen kann.
2. Speichermanager, Speicherverwaltung. Verantwortlich für die Verwaltung der Speicherressourcen, damit verschiedene Prozesse die Speicherressourcen der Maschine sicher gemeinsam nutzen können. Darüber hinaus stellt die Speicherverwaltung einen virtuellen Speichermechanismus bereit, der es dem Prozess ermöglicht, mehr Speicher als den verfügbaren Speicher des Systems zu verwenden. Der nicht verwendete Speicher wird über das Dateisystem im externen nichtflüchtigen Speicher gespeichert und bei Bedarf abgerufen. in Erinnerung.
3. VFS (Virtual File System), virtuelles Dateisystem. Der Linux-Kernel abstrahiert externe Geräte mit unterschiedlichen Funktionen, wie z. B. Festplattengeräte (Festplatte, Magnetplatte, NAND-Flash, Nor-Flash usw.), Eingabe- und Ausgabegeräte, Anzeigegeräte usw., in einer einheitlichen Dateibetriebsschnittstelle (offen). , schließen, lesen, schreiben usw.) zugreifen. Dies ist die Verkörperung von „Alles ist eine Datei“ im Linux-System (tatsächlich ist Linux nicht gründlich, da die CPU, der Speicher, das Netzwerk usw. noch keine Dateien sind. Wenn Sie wirklich alles als Datei benötigen, können Sie Folgendes tun Ich muss mir ansehen, was Bell Labs für „Plan 9“ entwickelt.
4. Netzwerk, Netzwerksubsystem. Verantwortlich für die Verwaltung der Netzwerkgeräte des Systems und die Implementierung verschiedener Netzwerkstandards.
5. IPC (Inter-Process Communication), Interprozesskommunikation. IPC verwaltet keine Hardware, sondern ist hauptsächlich für die Kommunikation zwischen Prozessen im Linux-System verantwortlich.
3.2 Process Scheduler
Process Scheduler ist das wichtigste Subsystem im Linux-Kernel. Es sorgt hauptsächlich für die Zugriffskontrolle auf die CPU. Da die CPU-Ressourcen in Computern begrenzt sind und viele Anwendungen CPU-Ressourcen nutzen, ist ein „Prozessplanungs-Subsystem“ erforderlich, um die CPU zu planen und zu verwalten.
Das Prozessplanungs-Subsystem umfasst 4 Untermodule (siehe Abbildung unten), deren Funktionen wie folgt sind:
1. Planungsrichtlinie, eine Strategie zur Implementierung der Prozessplanung, die bestimmt, welche (oder mehrere) Prozesse durchgeführt werden Habe die CPU.
2. Architekturspezifische Scheduler, die architekturbezogenen Teile, werden verwendet, um die Steuerung verschiedener CPUs in einer einheitlichen Schnittstelle zu abstrahieren. Diese Steuerelemente werden hauptsächlich während der Suspend- und Resume-Prozesse verwendet, einschließlich CPU-Registerzugriff, Assembler-Anweisungsvorgängen usw.
3. Architekturunabhängiger Scheduler, der architekturunabhängige Teil. Es kommuniziert mit dem „Scheduling Policy-Modul“, um zu entscheiden, welcher Prozess als nächstes ausgeführt werden soll, und setzt dann den angegebenen Prozess über das „Architecture-spezifische Scheduler-Modul“ fort.
4. Systemaufrufschnittstelle, Systemaufrufschnittstelle. Das Prozessplanungssubsystem öffnet die Schnittstellen, die dem Benutzerraum über die Systemaufrufschnittstelle bereitgestellt werden müssen, und schirmt gleichzeitig Details ab, die keine Pflege durch Benutzerraumprogramme erfordern.
3.3 Memory Manager (MM)
Die Speicherverwaltung ist auch das wichtigste Subsystem im Linux-Kernel. Sie sorgt hauptsächlich für die Zugriffskontrolle auf Speicherressourcen. Das Linux-System stellt eine Zuordnungsbeziehung zwischen dem physischen Hardwarespeicher und dem vom Prozess verwendeten Speicher (virtueller Speicher genannt) her. Diese Zuordnung erfolgt pro Prozess, sodass verschiedene Prozesse denselben virtuellen Speicher verwenden können, und diese können denselben virtuellen Speicher verwenden verschiedenen physischen Erinnerungen zugeordnet werden.
Das Speicherverwaltungssubsystem umfasst 3 Untermodule (siehe Abbildung unten), deren Funktionen wie folgt sind:
1. Architekturspezifische Manager, architekturbezogene Teile. Bietet eine virtuelle Schnittstelle für den Zugriff auf den Hardwarespeicher.
2. Architekturunabhängiger Manager, architekturunabhängiger Teil. Bietet alle Speicherverwaltungsmechanismen, einschließlich: prozessbasiertes Speichermapping;
3. Systemaufrufschnittstelle, Systemaufrufschnittstelle. Über diese Schnittstelle werden Funktionen wie Speicherzuweisung und -freigabe sowie Dateizuordnung für User-Space-Programmanwendungen bereitgestellt.
3.4 Virtuelles Dateisystem (VFS)
Ein Dateisystem im herkömmlichen Sinne ist eine Methode zum Speichern und Organisieren von Computerdaten. Es abstrahiert die kalten Datenblöcke auf Computerfestplatten, Festplatten und anderen Geräten auf leicht verständliche und benutzerfreundliche Weise (Datei- und Verzeichnisstruktur) und erleichtert so deren Auffindbarkeit und Zugriff. Daher ist das Wesentliche des Dateisystems „eine Methode zum Speichern und Organisieren von Daten“, und die Manifestation des Dateisystems besteht darin, „Daten von einem bestimmten Gerät zu lesen und Daten auf ein bestimmtes Gerät zu schreiben“.
Mit der Weiterentwicklung der Computertechnologie werden auch die Methoden zum Speichern und Organisieren von Daten ständig verbessert, was zu verschiedenen Arten von Dateisystemen führt, wie z. B. FAT, FAT32, NTFS, EXT2, EXT3 usw. Aus Kompatibilitätsgründen muss das Betriebssystem oder der Kernel mehrere Arten von Dateisystemen in derselben Ausdrucksform unterstützen, was das Konzept des virtuellen Dateisystems (VFS) erweitert.
Die Funktion von VFS besteht darin, verschiedene Dateisysteme zu verwalten, ihre Unterschiede abzuschirmen und Benutzerprogrammen eine Schnittstelle für den einheitlichen Zugriff auf Dateien bereitzustellen.
Wir können Daten von Festplatten, Festplatten, NAND-Flash und anderen Geräten lesen oder schreiben, daher wurden die ursprünglichen Dateisysteme auf diesen Geräten erstellt. Dieses Konzept kann auch auf andere Hardwaregeräte ausgeweitet werden, wie z. B. Speicher, Display (LCD), Tastatur, serielle Schnittstelle usw.
Unsere Zugriffskontrolle auf Hardwaregeräte kann auch als Lesen oder Schreiben von Daten zusammengefasst werden, sodass über eine einheitliche Dateioperationsschnittstelle darauf zugegriffen werden kann. Dies ist die Aufgabe des Linux-Kernels. Zusätzlich zum herkömmlichen Festplattendateisystem abstrahiert er auch das Gerätedateisystem, das Speicherdateisystem usw. Diese Logiken werden alle vom VFS-Subsystem implementiert.
Das VFS-Subsystem umfasst 6 Untermodule (siehe Abbildung unten), deren Funktionen wie folgt sind:
1. Gerätetreiber, Gerätetreiber, die zur Steuerung aller externen Geräte und Controller verwendet werden. Da es eine große Anzahl von Hardwaregeräten (insbesondere eingebetteten Produkten) gibt, die nicht miteinander kompatibel sind, gibt es auch viele Gerätetreiber. Daher besteht fast die Hälfte des Quellcodes im Linux-Kernel aus Gerätetreibern. Die meisten zugrunde liegenden Linux-Ingenieure (insbesondere inländische Unternehmen) schreiben oder warten Gerätetreiber und haben keine Zeit, andere Inhalte abzuschätzen (was genau das Wesen von Linux ist). Kernel).
2. Geräteunabhängige Schnittstelle, dieses Modul definiert eine einheitliche Methode zur Beschreibung von Hardwaregeräten (einheitliches Gerätemodell). Alle Gerätetreiber entsprechen dieser Definition, was die Schwierigkeit der Entwicklung verringern kann. Gleichzeitig können Schnittstellen nach oben durchgängig bereitgestellt werden.
3. Logische Systeme, jedes Dateisystem entspricht einem logischen System (logisches Dateisystem), das eine bestimmte Dateisystemlogik implementiert.
4. Systemunabhängige Schnittstelle: Dieses Modul ist für die Darstellung von Hardwaregeräten und logischen Dateisystemen mit einer einheitlichen Schnittstelle (schnelles Gerät und Zeichengerät) verantwortlich, sodass sich die Software der oberen Ebene nicht mehr um die spezifische Hardwareform kümmert.
5. Die Systemaufrufschnittstelle bietet dem Benutzer eine einheitliche Schnittstelle für den Zugriff auf Dateisysteme und Hardwaregeräte.
3.5 Netzwerksubsystem (Netz)
Das Netzwerksubsystem ist hauptsächlich für die Verwaltung verschiedener Netzwerkgeräte im Linux-Kernel, die Implementierung verschiedener Netzwerkprotokollstapel und letztendlich für die Realisierung der Funktion der Verbindung anderer Systeme über das Netzwerk verantwortlich. Im Linux-Kernel ist das Netzwerk-Subsystem nahezu eigenständig. Es umfasst 5 Untermodule (siehe Abbildung unten). Ihre Funktionen sind wie folgt:
1 Subsystem Die Gerätetreiber in sind gleich.
2. Geräteunabhängige Schnittstelle, die mit der im VFS-Subsystem identisch ist.
3. Netzwerkprotokolle, die verschiedene Netzwerkübertragungsprotokolle wie IP, TCP, UDP usw. implementieren.
4. Protokollunabhängige Schnittstelle, schirmt verschiedene Hardwaregeräte und Netzwerkprotokolle ab und stellt Schnittstellen (Sockets) im gleichen Format bereit.
5. Die Systemaufrufschnittstelle bietet dem Benutzer eine einheitliche Schnittstelle für den Zugriff auf Netzwerkgeräte.
Da die Funktion des IPC-Subsystems relativ einfach ist, wird sie hier nicht beschrieben.
Der Linux-Kernel-Quellcode umfasst drei Hauptteile:
1. Kernel-Kerncode, einschließlich verschiedener in Kapitel 3 beschriebener Subsysteme und Submodule, wie z. B. Energieverwaltung, Linux-Initialisierung usw.
2. Andere Nicht-Kerncodes, wie z. B. Bibliotheksdateien (da der Linux-Kernel ein eigenständiger Kernel ist, d. h. der Kernel ist nicht auf andere Software angewiesen und kann selbst kompiliert werden) , Firmware-Sammlungen, KVM (Virtual Machine Technology) usw.
3. Kompilierungsskripte, Konfigurationsdateien, Hilfedokumente, Urheberrechtshinweise und andere Hilfsdateien
Die Verzeichnisstruktur der obersten Ebene des Kernel-Quellcodes, die mit dem Befehl ls angezeigt wird ist in Abbildung R unten dargestellt. Die spezifische Beschreibung lautet wie folgt.
include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。 kernel/ ---- Linux内核的核心代码,包含了3.2小节所描述的进程调度子系统,以及和进程调度相关的模块。 mm/ ---- 内存管理子系统(3.3小节)。 fs/ ---- VFS子系统(3.4小节)。 net/ ---- 不包括网络设备驱动的网络子系统(3.5小节)。 ipc/ ---- IPC(进程间通信)子系统。 arch// ---- 体系结构相关的代码,例如arm, x86等等。 arch//mach- ---- 具体的machine/board相关的代码。 arch//include/asm ---- 体系结构相关的头文件。 arch//boot/dts ---- 设备树(Device Tree)文件。 init/ ---- Linux系统启动初始化相关的代码。 block/ ---- 提供块设备的层次。 sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。 drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。 lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。 crypto/ ----- 加密、解密相关的库函数。 security/ ---- 提供安全特性(SELinux)。 virt/ ---- 提供虚拟机技术(KVM等)的支持。 usr/ ---- 用于生成initramfs的代码。 firmware/ ---- 保存用于驱动第三方设备的固件。 samples/ ---- 一些示例代码。 tools/ ---- 一些常用工具,如性能剖析、自测试等。 Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。 COPYING ---- 版权声明。 MAINTAINERS ----维护者名单。 CREDITS ---- Linux主要的贡献者名单。 REPORTING-BUGS ---- Bug上报的指南。 Documentation, README ---- 帮助、说明文档。
Verwandte Empfehlungen: „Linux Video Tutorial“
Das obige ist der detaillierte Inhalt vonLinux-Kernel-Quellcode der fünf Hauptmodule und Gesamtdesign der Kernel-Architektur (detaillierte Grafik- und Texterklärung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!