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.

