Windows Subsystem for Linux: WSL übersetzt Linux-Systemaufrufe über den NT-Kernel

Microsoft beschreibt am 8. Juni 2016, wie das Windows Subsystem for Linux Systemaufrufe verarbeitet. WSL führt unveränderte Linux-ELF64-Binärdateien auf Windows aus und bildet dafür die Linux-Kernel-Schnittstelle auf dem Windows-NT-Kernel nach.

Die technische Ergänzung zur zuvor beschriebenen WSL-Architektur konzentriert sich auf den Übergang zwischen User Mode und Kernel Mode. Linux-Programme verwenden dabei weiterhin die Linux-Konvention für x86_64-Systemaufrufe, obwohl die Verarbeitung auf Windows stattfindet.

Linux- und NT-Aufrufe folgen unterschiedlichen ABIs

Ein Systemaufruf verbindet ein Programm mit einer Kernel-Funktion. Dafür legt die jeweilige Application Binary Interface fest, in welchen Registern Parameter und Aufrufnummern stehen. Microsoft stellt im Beitrag den Linux-Aufruf getdents64 dem Windows-Aufruf NtQueryDirectoryFile gegenüber. Beide greifen auf Verzeichnisdaten zu, unterscheiden sich aber bei Registern, Aufrufnummern und Rückgabewerten.

Unter Linux werden die Parameter nach der System-V-Konvention in Register geschrieben, bevor die Instruktion syscall den Wechsel in den Kernel auslöst. Windows NT verwendet eine andere Registerbelegung und meldet Fehler über NTSTATUS-Werte. Die Linux- und NT-Schnittstellen sind deshalb nicht direkt austauschbar, auch wenn einzelne Funktionen ähnliche Aufgaben erfüllen.

Pico-Treiber übernehmen die WSL-Schicht

WSL erkennt, ob ein Systemaufruf von einem Pico-Prozess stammt, und leitet ihn an die Treiber lxss.sys und lxcore.sys weiter. Diese Komponenten bilden eine Linux-kompatible Kernel-Schnittstelle, ohne Linux-Kernelcode zu verwenden. Wo eine passende NT-Funktion existiert, kann WSL den Aufruf weiterreichen. sched_yield wird beispielsweise an ZwYieldExecution gekoppelt.

Andere Funktionen benötigen eine eigene Implementierung. Linux-Pipes unterscheiden sich bei ihren Eigenschaften von NT-Pipes, weshalb WSL die Linux-Semantik selbst nachbildet und nur grundlegende Windows-Funktionen für Synchronisation und Datenstrukturen nutzt. Für fork, das in Windows keine dokumentierte Entsprechung besitzt, erzeugt die Schicht einen Prozess mit identischem Registerzustand und setzt die Linux-spezifische Verarbeitung anschließend fort.

Kompatibilität mit unterschiedlichem Unterstützungsgrad

Zum damaligen Stand nennt Microsoft rund 235 implementierte Linux-Systemaufrufe. Der Unterstützungsgrad fällt je nach Funktion unterschiedlich aus und sollte mit dem weiteren Ausbau von WSL wachsen. Das im Originalbeitrag veröffentlichte Diagramm zur Systemaufrufverarbeitung zeigt den Weg von Linux-Funktionen wie getdents über lxss.sys in den NT-Kernel.

Diagramm zur Übersetzung von Linux-Systemaufrufen durch WSL und den NT-Kernel - Bild: Microsoft
Diagramm zur Übersetzung von Linux-Systemaufrufen durch WSL und den NT-Kernel – Bild: Microsoft

Weitere News

Weitere News

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein