Cet article vous apporte des connaissances pertinentes sur le code source du noyau des cinq principaux modules de Linux, y compris les problèmes liés à la conception globale de l'architecture du noyau. J'espère qu'il sera utile à tout le monde.
Recommandations associées : "Tutoriel vidéo Linux"
Cet article est une partie professionnelle de la série "Analyse du code source du noyau Linux". Il utilisera les fonctions de base du noyau comme. le point de départ pour décrire l'architecture globale du noyau Linux, ainsi que les principaux sous-systèmes logiciels sous l'architecture. Après cela, la structure des répertoires des fichiers sources du noyau Linux sera introduite et correspondra à chaque sous-système logiciel.
Remarque : Cet article et d'autres articles « Analyse du noyau Linux » sont basés sur la convention suivante :
a) La version du noyau est Linux 5.6.18, qui peut être obtenue à partir du lien suivant :
https://mirrors.edge .kernel.org/pub/linux/kernel/v5.x/linux-5.6.18.tar.xz
b) Puisque la plupart des systèmes embarqués utilisent des processeurs ARM, les contenus liés à la partie architecture sont tous analysés avec ARM
Comme le montre la figure ci-dessous, le noyau Linux n'est qu'une partie du système d'exploitation Linux. Sur le côté inférieur, il gère tous les périphériques matériels du système ; de l'autre côté, il fournit des interfaces vers Library Routine (telles que la bibliothèque C) ou d'autres applications via des appels système.
Par conséquent, sa fonction principale est la suivante : gérer les périphériques matériels destinés à être utilisés par les applications. Les composants standard des ordinateurs modernes (qu'il s'agisse de PC ou de systèmes embarqués) sont le processeur, la mémoire (mémoire et mémoire externe), les périphériques d'entrée et de sortie, les périphériques réseau et autres périphériques. Ainsi afin de gérer ces périphériques, le noyau Linux propose l'architecture suivante.
(Le code est gratuit pour obtenir le message privé d'arrière-plan [code])
3.1 Architecture globale et division des sous-systèmes
La figure ci-dessus illustre l'architecture globale de Linux noyau. Selon les fonctions de base du noyau, le noyau Linux propose 5 sous-systèmes, qui sont responsables des fonctions suivantes :
1 Process Scheduler, également appelé gestion de processus et planification de processus. Responsable de la gestion des ressources CPU afin que chaque processus puisse accéder au CPU de la manière la plus équitable possible.
2. Memory Manager, gestion de la mémoire. Responsable de la gestion des ressources mémoire afin que divers processus puissent partager en toute sécurité les ressources mémoire de la machine. De plus, la gestion de la mémoire fournira un mécanisme de mémoire virtuelle, qui permettra au processus d'utiliser plus de mémoire que la mémoire disponible du système. La mémoire inutilisée sera enregistrée dans une mémoire non volatile externe via le système de fichiers et sera récupérée en cas de besoin. en mémoire.
3. VFS (Virtual File System), système de fichiers virtuel. Le noyau Linux résume les périphériques externes dotés de différentes fonctions, tels que les périphériques de disque (disque dur, disque magnétique, NAND Flash, Nor Flash, etc.), les périphériques d'entrée et de sortie, les périphériques d'affichage, etc., dans une interface d'exploitation de fichiers unifiée (ouverte). , fermer, lire, écrire, etc.) pour y accéder. C'est l'incarnation du « tout est un fichier » dans le système Linux (en fait, Linux n'est pas complet, car le processeur, la mémoire, le réseau, etc. ne sont pas encore des fichiers. Si vous avez vraiment besoin que tout soit un fichier, vous Il faudra regarder ce que les Bell Labs développent "Plan 9").
4. Réseau, sous-système réseau. Responsable de la gestion des périphériques réseau du système et de la mise en œuvre d'une variété de normes réseau.
5. IPC (Inter-Process Communication), communication inter-processus. IPC ne gère aucun matériel, il est principalement responsable de la communication entre les processus du système Linux.
3.2 Process Scheduler
Process Scheduler est le sous-système le plus important du noyau Linux. Il fournit principalement le contrôle d'accès au CPU. Étant donné que les ressources du processeur sont limitées sur les ordinateurs et que de nombreuses applications utilisent les ressources du processeur, un « sous-système de planification des processus » est nécessaire pour planifier et gérer le processeur.
Le sous-système de planification des processus comprend 4 sous-modules (voir la figure ci-dessous), leurs fonctions sont les suivantes :
1 Politique de planification, une stratégie de mise en œuvre de la planification des processus, qui détermine quels (ou plusieurs) processus seront. avoir le processeur.
2. Les planificateurs spécifiques à l'architecture, les parties liées à l'architecture, sont utilisés pour résumer le contrôle des différents processeurs dans une interface unifiée. Ces contrôles sont principalement utilisés pendant les processus de suspension et de reprise, impliquant l'accès aux registres du processeur, les opérations d'instructions d'assemblage, etc.
3. Planificateur indépendant de l'architecture, la partie indépendante de l'architecture. Il communiquera avec le « module Politique de planification » pour décider quel processus exécuter ensuite, puis reprendra le processus spécifié via le « module Planificateurs spécifiques à l'architecture ».
4. Interface d'appel système, interface d'appel système. Le sous-système de planification des processus ouvre les interfaces qui doivent être fournies à l'espace utilisateur via l'interface d'appel système, tout en protégeant les détails qui ne nécessitent pas la prise en charge des programmes de l'espace utilisateur.
3.3 Memory Manager (MM)
La gestion de la mémoire est également le sous-système le plus important du noyau Linux. Elle fournit principalement le contrôle d'accès aux ressources mémoire. Le système Linux établira une relation de mappage entre la mémoire physique matérielle et la mémoire utilisée par le processus (appelée mémoire virtuelle). Ce mappage s'effectue par processus, donc différents processus peuvent utiliser la même mémoire virtuelle, et ce sont les mêmes que la mémoire virtuelle. être mappés à différentes mémoires physiques.
Le sous-système de gestion de la mémoire comprend 3 sous-modules (voir la figure ci-dessous), leurs fonctions sont les suivantes :
1. Gestionnaires spécifiques à l'architecture, parties liées à l'architecture. Fournit une interface virtuelle pour accéder à la mémoire matérielle.
2. Gestionnaire Indépendant d'Architecture, partie indépendante de l'architecture. Fournit tous les mécanismes de gestion de la mémoire, notamment : le mappage de mémoire basé sur les processus ;
3. Interface d'appel système, interface d'appel système. Grâce à cette interface, des fonctions telles que l'allocation et la libération de mémoire, ainsi que le mappage de fichiers, sont fournies aux applications du programme de l'espace utilisateur.
3.4 Système de fichiers virtuel (VFS)
Un système de fichiers au sens traditionnel du terme est une méthode de stockage et d'organisation de données informatiques. Il extrait les blocs de données froids sur les disques informatiques, les disques durs et autres appareils d'une manière facile à comprendre et conviviale (structure de fichiers et de répertoires), facilitant ainsi leur recherche et leur accès. Par conséquent, l'essence du système de fichiers est « une méthode de stockage et d'organisation des données », et la manifestation du système de fichiers est « la lecture des données d'un certain appareil et l'écriture de données sur un certain appareil ».
Avec les progrès de la technologie informatique, les méthodes de stockage et d'organisation des données s'améliorent également constamment, ce qui donne naissance à différents types de systèmes de fichiers, tels que FAT, FAT32, NTFS, EXT2, EXT3, etc. Pour des raisons de compatibilité, le système d'exploitation ou le noyau doit prendre en charge plusieurs types de systèmes de fichiers sous la même forme d'expression, ce qui étend le concept de système de fichiers virtuel (VFS).
La fonction de VFS est de gérer différents systèmes de fichiers, de masquer leurs différences et de fournir aux programmes utilisateur une interface pour accéder aux fichiers de manière unifiée.
Nous pouvons lire ou écrire des données à partir de disques, de disques durs, de NAND Flash et d'autres appareils, de sorte que les systèmes de fichiers d'origine ont été construits sur ces appareils. Ce concept peut également être étendu à d'autres périphériques matériels, tels que la mémoire, l'affichage (LCD), le clavier, le port série, etc.
Notre contrôle d'accès aux périphériques matériels peut également être résumé en lecture ou en écriture de données, afin qu'elles soient accessibles à l'aide d'une interface d'exploitation de fichiers unifiée. C'est ce que fait le noyau Linux. En plus du système de fichiers disque traditionnel, il fait également abstraction du système de fichiers du périphérique, du système de fichiers mémoire, etc. Ces logiques sont toutes implémentées par le sous-système VFS.
Le sous-système VFS comprend 6 sous-modules (voir l'image ci-dessous), leurs fonctions sont les suivantes :
1. Pilotes de périphériques, pilotes de périphériques, utilisés pour contrôler tous les périphériques et contrôleurs externes. Comme il existe un grand nombre de périphériques matériels (en particulier les produits intégrés) incompatibles entre eux, il existe également de nombreux pilotes de périphériques. Par conséquent, près de la moitié du code source du noyau Linux est constitué de pilotes de périphériques. La plupart des ingénieurs Linux sous-jacents (en particulier les entreprises nationales) écrivent ou maintiennent des pilotes de périphériques et n'ont pas le temps d'évaluer d'autres contenus (ce qui est précisément l'essence de Linux). emplacement du noyau).
2. Device Independent Interface, ce module définit une manière unifiée de décrire les périphériques matériels (modèle de périphérique unifié). Tous les pilotes de périphériques sont conformes à cette définition, ce qui peut réduire la difficulté de développement. Dans le même temps, les interfaces peuvent être fournies de manière cohérente vers le haut.
3. Systèmes logiques, chaque système de fichiers correspondra à un système logique (système de fichiers logique), qui mettra en œuvre une logique de système de fichiers spécifique.
4. Interface indépendante du système, ce module est chargé de représenter les périphériques matériels et les systèmes de fichiers logiques avec une interface unifiée (périphérique rapide et périphérique de caractères), de sorte que le logiciel de couche supérieure ne se soucie plus de la forme matérielle spécifique.
5. L'interface d'appel système fournit à l'espace utilisateur une interface unifiée pour accéder aux systèmes de fichiers et aux périphériques matériels.
3.5 Sous-système réseau (Net)
Le sous-système réseau est principalement responsable de la gestion de divers périphériques réseau dans le noyau Linux, de la mise en œuvre de diverses piles de protocoles réseau et, finalement, de la fonction de connexion d'autres systèmes via le réseau. Dans le noyau Linux, le sous-système réseau est presque autonome. Il comprend 5 sous-modules (voir la figure ci-dessous) :
1. sous-système Les pilotes de périphérique sont les mêmes.
2. Interface indépendante du périphérique, qui est la même que celle du sous-système VFS.
3. Protocoles réseau, implémentant divers protocoles de transmission réseau, tels que IP, TCP, UDP, etc.
4. Interface indépendante du protocole, protège différents périphériques matériels et protocoles réseau et fournit des interfaces (sockets) dans le même format.
5. L'interface d'appel système, l'interface d'appel système, fournit à l'espace utilisateur une interface unifiée pour accéder aux périphériques réseau.
Quant au sous-système IPC, sa fonction étant relativement simple, il ne sera pas décrit ici.
Le code source du noyau Linux comprend trois parties principales :
1. Le code principal du noyau, y compris divers sous-systèmes et sous-modules décrits dans le chapitre 3, et d'autres sous-systèmes de support, tels que la gestion de l'alimentation, Initialisation Linux, etc.
2. Autres codes non essentiels, tels que les fichiers de bibliothèque (car le noyau Linux est un noyau autonome, c'est-à-dire que le noyau ne repose sur aucun autre logiciel et peut être compilé par lui-même) , collections de micrologiciels, KVM (technologie de machine virtuelle), etc.
3. Scripts de compilation, fichiers de configuration, documents d'aide, avis de droits d'auteur et autres fichiers auxiliaires
La structure de répertoires de niveau supérieur du code source du noyau vue à l'aide de la commande ls. est illustré dans la figure R ci-dessous. La description spécifique est la suivante.
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 ---- 帮助、说明文档。
Recommandations associées : "Tutoriel vidéo Linux"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!