linux-kernel système - Quelle est la différence entre l'espace noyau et l'espace utilisateur?





d'exploitation méta (13)


L'espace du noyau et l'espace virtuel sont des concepts de mémoire virtuelle ... cela ne signifie pas que Ram (votre mémoire actuelle) est divisé en noyau et en espace utilisateur. Chaque processus reçoit une mémoire virtuelle qui est divisée en noyau et espace utilisateur.

Donc, disant "La mémoire vive (RAM) peut être divisée en deux régions distinctes à savoir - l'espace du noyau et l'espace utilisateur." est faux.

& en ce qui concerne l'espace "noyau espace vs espace utilisateur"

Lorsqu'un processus est créé et que sa mémoire virtuelle est divisée en espace utilisateur et espace noyau, où la zone espace utilisateur contient des données, le code, la pile, le tas du processus et l'espace noyau contiennent des éléments tels que la table de pages du processus Pour exécuter le code d'espace noyau, le contrôle doit passer en mode noyau (en utilisant l'interruption logicielle 0x80 pour les appels système) et la pile noyau est fondamentalement partagée entre tous les processus s'exécutant actuellement dans l'espace noyau.

Quelle est la différence entre l'espace noyau et l'espace utilisateur? Est-ce que l'espace du noyau, les threads du noyau, les processus du noyau et la pile du noyau signifient la même chose? Aussi, pourquoi avons-nous besoin de cette différenciation?




L'espace du noyau et l'espace utilisateur sont des espaces logiques.

La plupart des processeurs modernes sont conçus pour fonctionner dans différents modes privilégiés. Les machines x86 peuvent fonctionner dans 4 modes privilégiés différents.

Et une instruction machine particulière peut être exécutée dans / au-dessus du mode privilégié particulier.

En raison de cette conception, vous donnez une protection du système ou une boîte de sable dans l'environnement d'exécution.

Le noyau est un morceau de code, qui gère votre matériel et fournit l'abstraction du système. Donc, il doit avoir accès à toutes les instructions de la machine. Et c'est le morceau de logiciel le plus fiable. Donc, je devrais être exécuté avec le plus haut privilège. Et Ring niveau 0 est le mode le plus privilégié. Donc, Ring Level 0 est aussi appelé en mode Kernel .

L'application utilisateur est un logiciel provenant d'un fournisseur tiers et vous ne pouvez pas leur faire entièrement confiance. Quelqu'un avec une intention malveillante peut écrire un code pour planter votre système s'il avait un accès complet à toutes les instructions de la machine. Donc, l'application doit être fournie avec un accès à un ensemble limité d'instructions. Et Ring Level 3 est le mode le moins privilégié. Donc, toute votre application fonctionne dans ce mode. Par conséquent, Ring Level 3 est également appelé User Mode .

Note: Je n'obtiens pas les Niveaux de Ring 1 et 2. Ce sont essentiellement des modes avec privilège intermédiaire. Ainsi, le code du pilote de périphérique peut être exécuté avec ce privilège. AFAIK, Linux utilise uniquement Ring Level 0 et 3 pour l'exécution de code noyau et l'application utilisateur respectivement.

Donc, toute opération qui se passe en mode noyau peut être considérée comme un espace noyau. Et toute opération qui se passe en mode utilisateur peut être considérée comme un espace utilisateur.




L'espace du noyau signifie qu'un espace mémoire ne peut être touché que par le noyau. Sur linux 32 bits, il est 1G (de 0xC0000000 à 0xffffffff en tant qu'adresse de mémoire virtuelle). Chaque processus créé par le noyau est aussi un thread du noyau, donc pour un processus, il y a deux piles: une pile dans l'espace utilisateur pour ce processus et une autre dans le noyau espace pour le thread du noyau.

la pile du noyau occupait 2 pages (8k en 32bit linux), incluait une task_struct (environ 1k) et la pile réelle (environ 7k). Ce dernier est utilisé pour stocker certaines variables automatiques ou paramètres d'appel de fonction ou adresse de fonction dans les fonctions du noyau. Voici le code (Processor.h (linux \ include \ asm-i386)):

#define THREAD_SIZE (2*PAGE_SIZE)
#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
#define free_task_struct(p) free_pages((unsigned long) (p), 1)

__get_free_pages (GFP_KERNEL, 1)) signifie alloc memory en 2 ^ 1 = 2 pages.

Mais la pile de processus est une autre chose, son adresse est juste ci-dessous 0xC0000000 (32bit linux), la taille de celui-ci peut être plus grande, utilisée pour les appels de fonction de l'espace utilisateur.

Donc, voici une question qui vient pour l'appel système, il s'exécute dans l'espace noyau mais a été appelé par processus dans l'espace utilisateur, comment ça marche? Linux va-t-il mettre ses paramètres et son adresse de fonction dans la pile du noyau ou dans la pile de processus? Solution de Linux: tous les appels système sont déclenchés par l'interruption logicielle INT 0x80. Défini dans entry.S (linux \ arch \ i386 \ kernel), voici quelques lignes par exemple:

ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_syscall)   /* 0  -  old "setup()" system call*/
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
.long SYMBOL_NAME(sys_open)     /* 5 */
.long SYMBOL_NAME(sys_close)



Par Sunil Yadav, sur Quora:

Le noyau Linux fait référence à tout ce qui s'exécute en mode noyau et est constitué de plusieurs couches distinctes. Au niveau le plus bas, le noyau interagit avec le matériel via le HAL. Au niveau intermédiaire, le noyau UNIX est divisé en 4 zones distinctes. Le premier des quatre domaines gère les dispositifs de caractères, ATS cru et cuit et la manipulation des terminaux. La deuxième zone gère les pilotes de périphériques réseau, les protocoles de routage et les sockets. La troisième zone gère les pilotes de périphériques de disque, les caches de page et de mémoire tampon, le système de fichiers, la mémoire virtuelle, le nommage de fichiers et le mappage. La quatrième et dernière zone s'occupe de la répartition, de la planification, de la création et de la terminaison des processus, ainsi que de la gestion des signaux. Surtout, nous avons la couche supérieure du noyau qui comprend les appels système, les interruptions et les interruptions. Ce niveau sert d'interface à chacune des fonctions de niveau inférieur. Un programmeur utilise les divers appels système et interruptions pour interagir avec les fonctionnalités du système d'exploitation.




En bref: le noyau fonctionne dans l'espace noyau, l'espace noyau a un accès complet à toute la mémoire et aux ressources, vous pouvez dire la division de la mémoire en deux parties, une partie pour le noyau et une partie pour le processus utilisateur. l'espace ne peut pas accéder directement à l'espace du noyau, il demande donc au noyau d'utiliser les ressources. par syscall (appel système prédéfini dans la glibc)

il y a une déclaration qui simplifie les différents " Espace utilisateur est juste une charge de test pour le noyau " ...

Pour être très clair: l'architecture du processeur permet au CPU de fonctionner en deux modes, le mode noyau et le mode utilisateur , l'instruction matérielle permet de passer d'un mode à l'autre.

La mémoire peut être marquée comme faisant partie de l'espace utilisateur ou de l'espace noyau.

Lorsque la CPU fonctionne en mode utilisateur, la CPU ne peut accéder qu'à la mémoire de l'espace utilisateur, alors que cpu tente d'accéder à la mémoire du noyau, le résultat est une "exception matérielle", lorsque la CPU fonctionne en mode noyau. à la fois l'espace noyau et l'espace utilisateur ...




La taille maximale de l'espace adresse dépend de la longueur du registre d'adresses sur la CPU.

Sur les systèmes avec des registres d'adresses 32 bits, la taille maximale de l'espace d'adressage est de 2 32 octets, soit 4 GiB. De même, sur les systèmes 64 bits, 2 64 octets peuvent être adressés.

Cet espace d'adressage est appelé mémoire virtuelle ou espace d'adressage virtuel . Ce n'est pas vraiment lié à la taille de la RAM physique.

Sur les plateformes Linux, l'espace d'adressage virtuel est divisé en espace noyau et espace utilisateur.

Une constante spécifique à l'architecture appelée limite de taille de tâche , ou TASK_SIZE , marque la position où se produit le fractionnement:

  • la plage d'adresses allant de 0 à TASK_SIZE -1 est attribuée à l'espace utilisateur;

  • le reste de TASK_SIZE jusqu'à 2 32 -1 (ou 2 64 -1) est attribué à l'espace noyau.

Sur un système 32 bits particulier par exemple, 3 GiB pourraient être occupés pour l'espace utilisateur et 1 GiB pour l'espace noyau.

Chaque application / programme dans un système d'exploitation de type Unix est un processus; chacun de ceux-ci a un identificateur unique appelé Process Identifier (ou simplement Process ID , c'est-à-dire PID). Linux fournit deux mécanismes pour créer un processus: 1. l'appel système fork() , ou 2. l'appel exec() .

Un thread de noyau est un processus léger et également un programme en cours d'exécution. Un seul processus peut consister en plusieurs threads partageant les mêmes données et ressources mais empruntant des chemins différents à travers le code du programme. Linux fournit un appel système clone() pour générer des threads.

Exemples d'utilisation des threads du noyau: synchronisation des données de la RAM, aide le planificateur à répartir les processus entre les processeurs, etc.




Chaque processus possède sa propre mémoire virtuelle de 4 Go qui est mappée à la mémoire physique via des tables de pages. La mémoire virtuelle est principalement divisée en deux parties: 3 Go pour l'utilisation du processus et 1 Go pour l'utilisation du noyau. La plupart des variables que vous créez se trouvent dans la première partie de l'espace d'adressage. Cette partie est appelée espace utilisateur. La dernière partie est où le noyau réside et est commun pour tous les processus. C'est ce qu'on appelle l'espace noyau et la plus grande partie de cet espace est mappée aux emplacements de départ de la mémoire physique où l'image du noyau est chargée au démarrage.




Sous Linux, il y a deux espaces, l'espace utilisateur et un espace kernal. l'espace utilisateur est composé uniquement d'une application utilisateur que vous souhaitez exécuter. En tant que service kernal, il y a la gestion des processus, la gestion des fichiers, la gestion des signaux, la gestion de la mémoire, la gestion des threads, et de nombreux services y sont présents. Si vous exécutez l'application à partir de l'espace utilisateur, cette application interagit uniquement avec le service kernal. et ce service interagit avec le pilote de périphérique qui est présent entre le matériel et le noyau. le principal avantage de l'espace kernal et de la séparation de l'espace utilisateur est que nous pouvons acchive une sécurité par le virus.bcaz de toutes les applications utilisateur présentes dans l'espace utilisateur, et le service est présent dans l'espace kernal. C'est pourquoi linux doesn, t affecter du virus.




L'espace du noyau et l'espace utilisateur sont la séparation des fonctions du système d'exploitation privilégié et des applications utilisateur restreintes. La séparation est nécessaire pour empêcher les applications utilisateur de saccager votre ordinateur. Ce serait une mauvaise chose si n'importe quel ancien programme utilisateur pouvait commencer à écrire des données aléatoires sur votre disque dur ou lire de la mémoire à partir de l'espace mémoire d'un autre programme utilisateur.

Les programmes d'espace utilisateur ne peuvent pas accéder directement aux ressources système, de sorte que l'accès est géré au nom du programme par le noyau du système d'exploitation. Les programmes d'espace utilisateur effectuent généralement de telles demandes du système d'exploitation via des appels système.

Les threads du noyau, les processus, la pile ne signifient pas la même chose. Ce sont des constructions analogues pour l'espace noyau comme leurs homologues dans l'espace utilisateur.




La mémoire à accès aléatoire (RAM) peut être divisée logiquement en deux régions distinctes à savoir: - l'espace noyau et l'espace utilisateur ( les adresses physiques de la RAM ne sont pas réellement divisées uniquement les adresses virtuelles , toutes implémentées par la MMU )

Le noyau s'exécute dans la partie de la mémoire qui y a droit. Cette partie de la mémoire ne peut pas être accédée directement par les processus des utilisateurs normaux, alors que le noyau peut accéder à toutes les parties de la mémoire. Pour accéder à une partie du noyau, les processus utilisateur doivent utiliser les appels système prédéfinis, c'est-à-dire open , read , write etc. De plus, la bibliothèque C fonctionne comme printf appelle l'appel système à son tour.

Les appels système agissent comme une interface entre les processus utilisateur et les processus du noyau. Les droits d'accès sont placés sur l'espace du noyau afin d'empêcher les utilisateurs de jouer avec le noyau, sans le savoir.

Ainsi, lorsqu'un appel système se produit, une interruption logicielle est envoyée au noyau. La CPU peut transmettre temporairement le contrôle à la routine de gestionnaire d'interruption associée. Le processus de noyau interrompu par l'interruption reprend une fois que la routine du gestionnaire d'interruption a terminé son travail.




La bonne réponse est: il n'y a pas d'espace noyau et d'espace utilisateur. Le jeu d'instructions du processeur dispose d'autorisations spéciales pour définir des éléments destructeurs, tels que la racine de la table de la table des pages, ou accéder à la mémoire du périphérique matériel, etc.

Le code noyau a les privilèges de niveau le plus élevé et le code utilisateur le plus bas. Cela empêche le code utilisateur de planter le système, de modifier d'autres programmes, etc.

Généralement, le code noyau est conservé sous une carte mémoire différente de celle du code utilisateur (tout comme les espaces utilisateur sont conservés dans des cartes mémoire différentes les unes des autres). C'est de là que viennent les termes «espace noyau» et «espace utilisateur». Mais ce n'est pas une règle absolue. Par exemple, étant donné que le x86 requiert indirectement que ses gestionnaires interruption / interruption soient mappés à tout moment, une partie (ou quelques OS tous) du noyau doit être mappée dans l'espace utilisateur. Encore une fois, cela ne signifie pas qu'un tel code a des privilèges d'utilisateur.

Pourquoi la distinction noyau / utilisateur est-elle nécessaire? Certains concepteurs sont en désaccord sur le fait que c'est en fait nécessaire. L'architecture Microkernel est basée sur l'idée que les sections les plus privilégiées du code devraient être aussi petites que possible, avec toutes les opérations significatives effectuées dans le code privilégié de l'utilisateur. Vous auriez besoin d'étudier pourquoi cela pourrait être une bonne idée, ce n'est pas un concept simple (et est célèbre pour avoir à la fois des avantages et des inconvénients).




La réponse vraiment simplifiée est que le noyau s'exécute dans l'espace du noyau, et les programmes normaux s'exécutent dans l'espace utilisateur. L'espace utilisateur est essentiellement une forme de boxe de sable - il restreint les programmes utilisateur afin qu'ils ne puissent pas jouer avec la mémoire (et d'autres ressources) appartenant à d'autres programmes ou par le noyau du système d'exploitation. Cela limite (mais n'élimine généralement pas entièrement) leur capacité à faire de mauvaises choses comme s'écraser sur la machine.

Le noyau est le noyau du système d'exploitation. Il a normalement un accès complet à toute la mémoire et au matériel de la machine (et tout le reste sur la machine). Pour que la machine reste aussi stable que possible, vous ne voulez normalement que le code le plus fiable et le mieux testé à exécuter en mode noyau / noyau.

La pile est juste une autre partie de la mémoire, donc naturellement elle est séparée avec le reste de la mémoire.




Voici un exemple de proxy inverse (en tant qu'équilibreur de charge).

Un client surfe sur website.com et le serveur qu'il rencontre a un proxy inverse qui s'exécute dessus. Le proxy inverse arrive à être pound . Pound prend la demande et l'envoie à l'un des trois serveurs d'applications assis derrière. Dans cet exemple, Pound est un équilibreur de charge. c'est à dire. il s'agit d'équilibrer la charge entre trois serveurs d'applications. Les serveurs d'applications restituent le contenu du site Web au client.





linux-kernel operating-system kernel terminology