Was bedeutet es, wenn Code im Kernel- oder Benutzermodus ausgeführt wird?
Kernel-Modus
Ein Programm, das in diesem Modus ausgeführt wird, hat vollen Zugriff auf die zugrunde liegende Hardware. Es kann jeden CPU-Befehl ausführen, auf jede Speicheradresse zugreifen und im Wesentlichen alles tun, was es will.
Benutzermodus Code, der in diesem Modus ausgeführt wird, kann nur über die API des Betriebssystems geändert werden. Es kann überhaupt nicht direkt auf die Hardware zugreifen .
Das Interessante dabei ist, dass dies auf den gängigen Architekturen über Hardware erzwungen wird - nicht nur über das Betriebssystem. Insbesondere die x86-Architektur verfügt über Schutzringe .
Der große Vorteil dieser Art der Trennung ist, dass ein Programmabsturz im Benutzermodus nicht immer schwerwiegend ist. In modernen Systemen ist dies normalerweise nicht der Fall.
Sehen Sie sich Jeffs Artikel an. Es ist sein übliches gutes Zeug.
Die kurze Antwort lautet: Sie sagt Ihnen nur, wo Programme ihre Zeit verbringen.
Für eine längere Antwort erkläre ich dies in zwei Schritten. Zuerst:
1. Aufrufen des Kernel-Modus
Jeder reguläre Code, den Sie schreiben, wird im "Benutzermodus" ausgeführt.
Programme können Bibliotheken verwenden, um allgemeine Aufgaben für sie auszuführen. Dies ist auch der Benutzermoduscode.
Irgendwann benötigt das Programm möglicherweise eine Kernfunktion vom System. Beispielsweise:
Diese wesentliche - hardwarenahe - Funktionalität ist Bestandteil des Kernels. Das ist das zentrale Programm hinter allem auf Ihrem Computer. Es verwaltet alles, was Programme zum Funktionieren benötigen.
Um eine Funktion im Kernel zu verwenden, springt der Programmausführungspfad buchstäblich vom Benutzermodus zum Kernel-Code. Der Kernel erledigt seine Aufgabe und faltet den Ausführungspfad zurück in den Benutzermodus.
Wenn ein Programm viel Zeit im Kernel-Modus verbringt, bedeutet dies oft, dass es viel Hardware-bezogene Aktivitäten ausführt. Zum Beispiel Festplatten-Suche oder Video-Streaming. Die Hardware könnte auch fehlerhaft sein. Verlangsamung der Verarbeitung und ungewöhnlich lange Verweildauer des Programms im Kernel.
2 der unterschied
Code im Kernelraum ist hochperformant. Die anderen Teile des Kernels können ihn direkt aufrufen, und der Code hat direkten Zugriff auf alle Ressourcen des Systems, ohne dass eine Grenzüberprüfung erforderlich ist. Das Umschalten zwischen Kernel- und Benutzermodus ist ebenfalls ein teurer Vorgang, der vollständig vermieden wird, indem alles im Kernelcode ausgeführt wird.
Im Kernel ist jedoch nicht viel Platz für Sicherheitsüberprüfungen, Absturzschutz oder das Beschreiben der falschen Speicherbereiche. Dies sind Dienste, die der Kernel für andere Programme bereitstellen kann. Es täuscht Programme vor, dass die Welt anders aussieht (Programme leben in einer virtuellen, sandkastenartigen / eingeschränkten Umgebung), und daher kann alles, was aus Programmen kommt, übersetzt und geschützt werden.
Der Kernel selbst kann nicht viel Schutz haben, da sich nichts dahinter befindet, um ihn zu schützen. Es ist das Herz des Systems, und wenn das aufhört, endet alles. Sie bekommen eine Kernel-Panik oder unter Windows das berühmte BSOD.
Dies ist auch das Risiko von Kernel-basiertem Code und der Grund, warum mehr Subsysteme mit geringen Leistungsanforderungen in den Anwenderbereich verlagert werden. Wesentliche hardwarebezogene Teile sind jedoch in der Regel Kernel-Code, der sich in Kürze nicht mehr ändern wird.
Es ist die Unterscheidung, ob der aktuell ausgeführte Code direkt mit verschiedenen Hardwareteilen interagieren darf. Kernelmoduscode kann in Gerätebusse schreiben, Speicherzuordnungen ändern, laufende Prozesse umschalten usw. Der Benutzermodus kann Berechnungen durchführen und Systemaufrufe in den Kernel senden, um mit dem Rest der Welt zu interagieren.