Quelle est la différence entre l'Userland vs the Kernel?

J'essaie de comprendre exactement ce qu'est userland? tout le monde que je request dit: "Tout ce qui n'est pas du kernel". mais ce n'est pas tangible pour moi. Quand je lis ce kernel peut exécuter ce pilote sur le userland ou quelque chose comme ça; Je ne peux pas imaginer ce qui va se passer! Donc, j'apprécierais si quelqu'un m'a mis directement à cet égard.

Sur un niveau conceptuel, le kernel est tout ce qui fonctionne à un niveau de protection du matériel "plus privilégié". Ce serait comme l'anneau 0 sur les processeurs x86, le mode système sur ARM, le mode kernel sur MIPS, le mode superviseur sur 68xxx, etc. Le kernel est généralement commandé par interruption, soit les interruptions logicielles (appels système), soit les interruptions matérielles maps, timers matérielles).

Sur ce même niveau conceptuel, "user land" est ce qui fonctionne dans le mode le less privilégié (anneau 3 sur les processeurs x86, mode user sur ARM ou MIPS, etc.). Les users utilisent la façon dont le kernel lisse les différences matérielles mineures, en présentant la même API à tous les programmes. Par exemple, certaines maps sans fil peuvent avoir des registres de contrôle supplémentaires par rapport aux autres, ou contenir plus ou less de memory tampon embarquée pour les packages entrants. Le code du pilote tient count de ces différences (parfois en ignorant les fonctionnalités avancées ou inhabituelles) et présente la même API de socket à tous les programmes.

Certains processeurs (par exemple x86, VAX, Alpha AXP) ont plus de deux modes, mais l'architecture Unix générique n'utilise pas les modes intermédiaires.

Les programmes et les process que vous voyez s'exécutant sous Unix ou Linux ou * BSD sont les users. Comme les process sont préemptibles, vous ne voyez jamais le kernel s'exécuter, vous voyez juste des effets secondaires, comme un appel système read() ou une fonction de gestionnaire de signal en cours d'exécution.

Pour répondre à votre question spécifique, sous Unix, Linux, * BSD, un «pilote» est généralement un petit logiciel qui traite des particularités d'un composant matériel: une carte réseau, un lecteur de disque, une carte video. Le logiciel du pilote doit toujours fonctionner en mode Ring 0 / mode superviseur / espace kernel afin d'avoir access aux interruptions matérielles ou à la memory mappée du matériel ou quoi que ce soit. Le pilote prend en charge des fonctionnalités matérielles spécifiques et adapte ce matériel à la vue normalisée ou conventionnelle du code du kernel sur le fonctionnement du matériel. Par conséquent, l'exécution d'un pilote dans un espace user nécessite que le kernel affiche un programme user, par exemple une memory mappée ou des registres ou interruptions de périphérique, ou d'autres fonctions spéciales. Cela peut être difficile, car les fonctionnalités spéciales d'un périphérique peuvent ne pas correspondre facilement à l'API de style Unix habituelle présentée aux programmes terrestres user. En outre, la programmation est un problème, car les programmes de terrain user ne répondent généralement pas aux interruptions si rapidement.

La plupart des CPU modernes ont un mode kernel ou superviseur, et un mode user restreint. C'est une fonctionnalité matérielle du CPU. "Userland" est un autre nom pour le code fonctionnant en mode user.

Une grande différence entre les modes est en ce qui concerne la façon dont la MMU de la plupart des processeurs moden agit sous eux.

Une MMU permet à un kernel de réarranger des blocs de RAM de sorte qu'ils semblent coder dans un ordre différent de ce qu'ils sont physiquement en RAM et que le code de mode user piège ou « redresse » en mode kernel si certaines pages sont accédé. Le mode user ne peut pas changer ce que fait le MMU, seul le mode kernel peut le faire.

Ainsi, le MMU permet au code en mode kernel de faire toutes sortes de choses sympas, comme:

  • "arranger" ou "mapper" la memory au code de mode user de sorte que ce code pense qu'il a une RAM contiguë.
  • mettre en œuvre un système de gestion de memory dynamic où un process aurait besoin de requestr de la memory avant d'essayer de l'utiliser.
  • arrêter les process user s'ils utilisent la memory qu'ils ne sont pas censés.
  • échangez les pages les less utilisées sur le disque si la memory libre est insuffisante et permutez-les lorsqu'une procédure tente d'y accéder.

Vous pouvez voir que le MMU, avec le kernel / mode user, est la pierre angular d'un operating system multitâche, et en utilisant ces outils, on peut créer un système qui fonctionne avec des choses de niveau supérieur comme l'idée de process. Un kernel maintient des tables de page pour chaque process et fondamentalement reprogramme la MMU avant de passer en mode user et donne le contrôle à un process pour son timelice. Des choses comme malloc et des choses où un process acquiert de la memory amène le kernel à modifier les tables de pages MMU.

Encore une fois, le mode user ne peut rien faire aux tables de pages (et n'a pas vraiment besoin de savoir), s'il a besoin de memory, il doit appeler le kernel, ce qui provoque un passage du mode user au mode kernel. Les processeurs fournissent un mécanisme simple appelé une interruption logicielle pour ce faire, et il existe d'autres moyens plus rapides que le kernel Linux utilise .

En raison de cette protection qui existe en mode user, si un programme fait quelque chose comme un plantage ou un piratage et se écrase, le kernel peut arrêter ce process. En mode kernel, cette protection n'existe pas, donc le kernel cessera de fonctionner et donc tout votre système cessera également de fonctionner. Lorsqu'une erreur irrécupérable comme celle-ci se produit en mode kernel, cela s'appelle une panique du kernel. Voir Qu'est-ce qu'une "panique de kernel"? pour plus de détails.

kernel peut exécuter ce pilote sur le userland

Le mode kernel ou superviseur des CPU empêche également le mode user d'accéder directement aux périphériques d'E / S, l'idée est qu'il doit appeler le kernel pour le faire. Dans Linux, le code qui parle directement aux périphériques (ils fonctionnent en mode kernel) sont des pilotes de périphériques (un type de module kernel , vous pouvez les manipuler avec des commands comme lsmod , insmod , modprobe et rmmod ).

Que se passe-t-il si le pilote de votre périphérique, qui s'exécute en mode kernel sous la configuration la plus simple, a un bogue et fait quelque chose de méchant comme écraser les trucs randoms dans la RAM (et comme il est en mode kernel, il a un access illimité à toutes les RAM et peut écraser le kernel lui-même). Ce serait bien si nous pouvions faire fonctionner le pilote de périphérique en mode user, afin qu'il ne puisse rien faire au kernel lui-même ou à d'autres process.

Malheureusement, le passage du mode user au mode kernel (appelé commutateur de context ) est lent car, fondamentalement, tout l'état de la CPU doit être activé et désactivé pour chaque process ou pour le kernel lui-même. Donc, nous avons deux choses en contradiction, la security ou la vitesse, et c'est donc un sharepoint discorde et de design.

Les kernelx qui essaient de faire autant que possible en mode user sont appelés microkernels , et Linux est le contraire, qui est appelé monolithique . Les pilotes en mode user existent pour Linux (regardez dans FUSE par exemple) et il y a même un framework qui le permet.

En s'appuyant sur ce que Bruce a dit, tout le code fourni au kernel doit être approuvé. S'il y a quelque part que le code malveillant peut être exécuté par le kernel, c'est terminé. C'est là que la séparation des privilèges du code exécuté par l'user et du code exécuté par le kernel entre en jeu. Le code géré par un user ne doit pas forcément être exempt du mal à 100%. Il n'est pas exécuté directement par le kernel.

Les programmes Userland interagissent simplement avec les parties exposées du kernel, telles que les API et les modules chargés. Un exemple serait iptables . Il existe plusieurs modules kernel (.ko) ou «drivers» qui font réellement le travail d' iptables , ils font partie du framework netfilter . Lorsque vous exécutez des commands à l'aide de /sbin/iptables vous utilisez le composant userland qui communique à son tour avec les modules netfilter chargés dans le kernel. Cela permet une séparation de sorte que le code user ne puisse pas être exécuté par inadvertance par le kernel.

Dans les systèmes d'exploitation Unix / Linux, nous différons entre l'espace user et l' espace kernel . Ce sont juste des synonymes pour userland et où le kernel appartient.

Vous pouvez le comprendre comme suit. Vous pouvez interagir avec tout ce qui se passe dans l'espace user. Ce qui n'est pas le cas dans l'espace kernel. Les démons, les bibliothèques et les applications appartiennent à l'espace user. Tout le code qui s'exécute en dehors du kernel du operating system appartient à l'espace user (userland).

L'espace du kernel est l'endroit où le kernel s'exécute lui-même. C'est une zone restreinte où même root n'a pas access. Mais l'user root peut manipuler certains parameters du kernel par une interface fournie par le kernel (procfs, sysfs).

La memory système est un bon exemple pour expliquer la différence entre le kernel et l'espace user. Un démon (qui s'exécute dans l'espace user) a besoin de memory pour s'exécuter. Le kernel gère toute la memory disponible. Le démon obtient une "memory virtuelle" du kernel, où le démon ne sait pas s'il s'agit d'une memory physique ou d'un espace swap ou autre chose. Le kernel est celui qui détermine quel type de memory le process obtient. Parce que la memory management se produit dans l'espace du kernel. D'autres choses qui se produisent dans l'espace du kernel sont la planification des process, la communication inter-process, la protection et la memory management, les appels système …

Qu'est-ce exactement userland?

Ainsi, userland est ce que le démon fait (ou peut faire) lors de l'interaction avec les ressouces des systèmes d'exploitation (E / S, réseau, memory, time processeur). Ces ressources sont cachées du process dans l'espace du kernel.

La réponse courte:

C'est ce que le cockpit d'un avion pour le pilote est.

Vous avez déjà plusieurs bonnes réponses, mais je pense qu'il y a aussi de la valeur dans une réponse courte et concise:

Les processeurs modernes permettent de limiter ce que le code spécifique est autorisé à faire. "Mode kernel" se réfère à un code sans ressortingction avec un access complet au matériel. "Userland" est un code avec des permissions restreintes. Si le code userland veut accéder à n'importe quoi sauf sa propre memory, il doit appeler le kernel, qui vérifie ensuite les permissions avant d'effectuer l'action demandée.

Une façon d'get une bonne compréhension approfondie de ces concepts serait de suivre un tutoriel comme ceux sur osdev.org ou le tutoriel de James Molloy .

Linux a un kernel monolithique, cela signifie que son code s'exécute entièrement dans l'anneau 0 sur l'architecture x86, comme Bruce l'a déclaré. Ainsi, ayant le contrôle total de toutes les ressources, le kernel gérera toutes les requests pour elles par des applications au niveau de l'user (fonctionnant au niveau de moindre privilège 3)

Pensez à ceci: si les applications de l'espace user avaient un access complet à la memory virtuelle – RAM – elles pourraient tout détruire, des stacks ou des tas d'autres process aux tampons internes du kernel. Le kernel mappe les pages dans le directory de la page de chaque process et, si l'application se comporte mal en essayant d'accéder à un location qui n'appartient pas à son espace d'adressage, elle sera forcément arrêtée.

Ensuite, réfléchissez à ce qui se passerait si chaque programme avait un access direct à une imprimante ou à un autre périphérique de sortie. Deux instances simultanées de process essayant d'imprimer sur l'imprimante brouillent tout, mais si ces requests passent par le kernel, elles seront mises en queue et traitées séparément, ce qui donnera lieu à deux pages imprimées distinctes.

En outre, comme les machines ont généralement un plus petit nombre de processeurs que les process en cours d'exécution, le kernel utilise un ordonnanceur pour basculer entre les process, chacun ayant son propre time fini pour utiliser le processeur. Lorsque ce timeout expire, il sera déplacé à la fin d'une list de process actifs ou vers une list de process inactifs – si le process a attendu datatables de certains périphériques. De cette façon, tous les process semblent être exécutés simultanément bien qu'un seul process, ou que le kernel utilise un processeur à un moment donné. Ce concept est appelé pseudo-parallélisme.

En ce qui concerne votre dernière question sur les pilotes sur le terrain de l'user: c'est encore possible, le kernel garde le contrôle total sur la communication avec l'appareil. Par exemple, le kernel peut mapper une région de la memory du kernel dans la région memory du pilote de l'espace user, lui donnant ainsi access à la memory du périphérique. Le kernel a toujours le pouvoir de transmettre les modifications à l'appareil ou non. Ce pilote terrestre de l'user fournira une interface agréable pour contrôler l'appareil vers d'autres applications user et, si le pilote se bloque, il y a de bonnes chances qu'il soit rechargé sans avoir à réinitialiser la machine. Si le pilote avait été dans l'espace kernel, disons un module, si le module est bloqué et ne peut pas être déchargé, il ne peut pas être rechargé non plus parce que les symboles sont déjà là, donc la seule chance est de réinitialiser machine.

Pour conclure, les applications telles que cat top ou "hello world" ne s'exécutent que dans l'espace user, n'ayant access aux ressources du système qu'à travers l'API Kernel, qui est un set de fonctions appelées système. Ainsi, lorsqu'une application lance un appel système read () pour lire à partir d'un file, le kernel prend le contrôle du processeur, lit datatables à l'aide du pilote approprié (comme le pilote HDD), puis recopy ces données dans l'adresse fournie par le pointeur passé à l'appel système read (), laissant l'application continuer à s'exécuter dès que ces données sont disponibles.

Différentes couches dans Linux, montrant également une séparation entre l'espace user et l'espace kernel entrer la description de l'image ici

pour l'image complète
La source

Au début, je suis d'accord qu'il y a ici beaucoup de bonnes réponses.
Ma consortingbution sera la plus courte définition que j'ai trouvée il y a quelques années à propos du kernel dans un livre d'administration système Linux: "kernel: la partie résidente de la memory de l'os".