12 points par GN⁺ 7 일 전 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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

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.elf depuis 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)

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 : _start dans main.c, avec notamment process.c et mmu.c

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 0x29 dans 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

Prérequis de compilation et d’exécution

  • Une toolchain croisée pour la cible i386-linux-musl est 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 WATCOM et LINUX doivent être correctement définies (voir .envrc.example pour un exemple)
  • Une image de disque dur hdd.base.img avec Windows 9x préinstallé est nécessaire
  • L’exécution de make génère hdd.img préparée pour WSL9x
  • Depuis l’invite MS-DOS, l’exécution de wsl ouvre un pty ; pour les couleurs ANSI, il est recommandé de précharger un pilote comme nnansi.com

Licence

  • GPL-3

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.