Sous-système Windows 9x pour Linux
(social.hails.org)- Projet expérimental permettant d’exécuter de manière coopérative un noyau Linux moderne (6.19) à l’intérieur du noyau Windows 9x, afin de tirer parti simultanément de l’ensemble des fonctionnalités des deux systèmes d’exploitation
- Contrairement à WSL, il n’utilise pas la virtualisation matérielle, ce qui permet de l’exécuter même sur un 486
- Il apporte dans l’environnement Windows 9x des fonctions d’OS modernes comme la pagination, la protection mémoire et l’ordonnancement préemptif, tout en permettant d’exécuter des applications côte à côte sans redémarrage
- Il se compose de trois éléments : un noyau Linux patché, un pilote VxD et un client
wsl.com, avec une adaptation de User-Mode Linux pour appeler l’API du noyau Win9x - Les appels système sont distribués via le gestionnaire d’erreur générale de protection (GPF) au lieu de
int 0x80, en raison de la limite de taille de la table des descripteurs d’interruptions de Win9x - « Fièrement écrit sans IA », sous licence GPL-3
WSL9x - codeberg.org/hails/wsl9x
Aperçu
- WSL9x est un sous-système Linux pour Windows 9x qui exécute de manière coopérative un noyau Linux moderne à l’intérieur du noyau Windows 9x (version 6.19 au moment de la rédaction)
- Il permet d’exploiter simultanément l’ensemble des fonctionnalités des deux systèmes d’exploitation, notamment la pagination, la protection mémoire et l’ordonnancement préemptif
- Il est possible d’exécuter côte à côte des applications des deux OS sans redémarrage
- Il a été écrit manuellement, sans IA
Architecture technique
- WSL9x se compose de trois éléments
- Noyau Linux patché (branche
win9x-um-6.19) - Pilote VxD
- Programme client
wsl.com
- Noyau Linux patché (branche
Pilote VxD
- Il prend en charge l’initialisation de WSL9x, avec pour point d’entrée
vxd/wsl9x.asm - Il configure le mappage initial du code noyau et charge
vmlinux.elfdepuis le disque via des interruptions DOS (vxd/loader.c,vxd/fs.asm) - Le noyau est compilé avec une adresse de base fixe de
0xd0000000 - Il démarre un nouveau thread dans la System VM et lui alloue une pile de 16 KiB pour l’entrée dans Linux
- Il entre ensuite dans une boucle d’événements qui gère l’entrée dans le noyau, la distribution des IRQ, le retour vers l’espace utilisateur et l’état inactif (
vxd/entry.c)
Appels système et gestion des défauts de page
- Le pilote gère les défauts de page et les appels système, c’est-à-dire les événements de l’espace utilisateur qui doivent être distribués au noyau
- Les appels système sont traités via le gestionnaire GPF
- Win9x ne dispose pas d’une table des descripteurs d’interruptions suffisamment longue pour installer correctement un gestionnaire pour
int 0x80, l’interruption d’appel système Linux i386 - Le gestionnaire GPF inspecte l’instruction fautive et, s’il s’agit de
int 0x80, fait avancer le pointeur d’instruction comme si l’interruption avait réussi avant de distribuer l’appel système Linux (vxd/fault.c)
- Win9x ne dispose pas d’une table des descripteurs d’interruptions suffisamment longue pour installer correctement un gestionnaire pour
Modifications du noyau Linux
- Le projet est basé sur User-Mode Linux, mais modifié pour appeler l’API du noyau Windows 9x au lieu de l’API POSIX
- Il s’exécute non pas en mode utilisateur (ring 3), mais en ring 0 (mode superviseur/noyau)
- Une grande partie de l’intégration avec le noyau Win9x, y compris le changement de contexte, se trouve côté noyau Linux
- Emplacement principal du code :
linux/arch/um/os-Win95 - Point d’entrée :
_startdansmain.c, avec notammentprocess.cetmmu.c
- Emplacement principal du code :
Client wsl.com
- Il s’agit d’un programme DOS 16 bits, implémenté dans
wsl/wsl.asm - Il permet d’utiliser l’invite MS-DOS comme fenêtre TTY sans implémentation TTY séparée
- À l’exécution, il appelle l’API WSL9x V86 (
vxd/v86_api.asm) pour obtenir une console inutilisée et demander que la sortie de cette console lui soit distribuée - Il entre ensuite dans une boucle d’événements en attente d’IRQ et tente une lecture clavier lorsqu’une interruption survient
- Il sert aussi de point de synchronisation pour le pilote de console (
vxd/console.c)- Lorsque la sortie Linux est prête, il planifie un événement puis exécute
int 0x29dans le contexte de la VM MS-DOS afin d’afficher les caractères dans la fenêtre DOS - Cette interruption est aussi le point où des pilotes ANSI pour DOS, comme NNANSI, interceptent la sortie terminal pour implémenter les séquences d’échappement ANSI
- Lorsque la sortie Linux est prête, il planifie un événement puis exécute
Prérequis de compilation et d’exécution
- Une toolchain croisée pour la cible
i386-linux-muslest nécessaire (usage de musl-cross-make recommandé) - Une toolchain Open Watcom v2 est nécessaire pour compiler les composants Windows
- Il faut compiler le noyau Linux patché depuis la branche
win9x-um-6.19 - Les variables d’environnement
WATCOMetLINUXdoivent être correctement définies (voir.envrc.examplepour un exemple) - Une image de disque dur
hdd.base.imgavec Windows 9x préinstallé est nécessaire - L’exécution de
makegénèrehdd.imgpréparée pour WSL9x - Depuis l’invite MS-DOS, l’exécution de
wslouvre un pty ; pour les couleurs ANSI, il est recommandé de précharger un pilote commennansi.com
Licence
- GPL-3
Aucun commentaire pour le moment.