Die beiden anderen Antworten (zum Zeitpunkt des Schreibens) beziehen sich auf Interrupts und das IDT. Dies ist jedoch richtig. Auf einer modernen Intel-ähnlichen CPU gibt es nicht weniger als drei Möglichkeiten, einen Kernel aufzurufen.
Methode 1: Interrupts.
Dies ist oben erklärt. Sie richten einen Eintrag in der Interrupt-Deskriptor-Tabelle / dem Interrupt-Vektor ein und führen dann einen Software-Interrupt aus, um in den Kernel einzutreten.
Der Hauptvorteil dieser Methode besteht darin, dass ein typischer Kernel ohnehin Interrupts verarbeiten muss und auf archaischer Hardware arbeitet.
Methode 2: Rufen Sie Gates auf.
Ein Call-Gate ist eine spezielle Art von Segmentauswahl. Das Ziel des Aufrufs muss in die globale oder lokale Segmentdeskriptortabelle (GDT bzw. LDT) geladen werden. Wenn Sie dann eine Ferngesprächsanweisung unter Verwendung des Anruffensters als Segment ausführen (der Versatz des Anrufs wird ignoriert), können Sie privilegierteren Code aufrufen. Call Gates sind extrem flexibel. Die IA-32-Architektur verfügt über vier Berechtigungsstufen, und mit Call Gates können Sie eine beliebige Stufe aufrufen.
Ich glaube nicht, dass Linux jemals Call Gates verwendet hat, aber Windows 95 hat es getan. Die Win95-Kerneldienste ( krnl386.exe
und kernel.dll
) wurden tatsächlich im Benutzermodus (Ring 3) ausgeführt. Die höchste Berechtigungsstufe (Ring 0) wurde nur für Treiber und einen Mikrokernel verwendet, der nur die Prozessumschaltung ausführte. Das Anrufen von Fahrern erfolgte über Callgates. Dies ermöglichte es älteren 16-Bit-Codes (von denen es eine Menge gab!), Win95-Treiber unter Verwendung eines normalen Fernaufrufs zu verwenden, so wie sie es immer taten.
Ein unzureichender Schutz der globalen Deskriptortabelle war die Ursache für mehrere Windows 95-Exploits, die es schafften, ihre eigenen Call-Gates durch Schreiben über den Speicher zu installieren.
Methode 3: SYSCALL / SYSRET und SYSENTER / SYSEXIT
Dies sind zwei Befehlssätze, die von AMD und Intel unabhängig voneinander erfunden wurden, aber im Wesentlichen dasselbe tun. SYSCALL / SYSRET stand an erster Stelle und war nur für AMD, SYSENTER / SYSEXIT war Intel, aber AMD implementiert es jetzt. Also beschreibe ich SYSENTER / SYSEXIT.
Im Gegensatz zu Call Gates kann SYSENTER nur zum Weiterleiten an Ring 0 und nur an einen Standort verwendet werden. Es hat jedoch den Vorteil einer extrem geringen Latenz, da es im Gegensatz zu einem Aufruf oder einer Unterbrechung den Stapel nicht berührt.
Der Übertragungsort wird unter Verwendung von drei modellspezifischen Registern eingerichtet: eines für die Segmentinformation und eines für den Befehlszeiger und den Stapelzeiger des Kernel-Codes. Da nichts auf den Stapel "geschoben" wird, ist der Benutzermoduscode dafür verantwortlich, dem Kernel mitzuteilen, wohin er zurückkehren soll, indem der Rückkehrbefehlszeiger und der Stapelzeiger in Registern übergeben werden. Der Kernel ist für die Wiederherstellung des Stapelzeigers verantwortlich, und der SYSEXIT-Befehl stellt den Befehlszeiger wieder her.
Weitere Informationen zu den Anweisungen SYSENTER und SYSEXIT.