Windows 9x alrendszer készült WSL9x néven a Linux kernel futtatásához

A WSL9x egy kísérleti, Windows 9x rendszerekhez készült Linux-alrendszer, amely Linux 6.19-es kernelt futtat a Windows 95, Windows 98 és Windows ME kernelével együttműködve. Ez nem a Microsoft-féle WSL régi rendszerekre implementált változata, hanem önálló retrocomputing projekt, amely újraindítás nélkül kapcsolja össze a Windows 9x környezetet egy módosított Linux kernellel.

Windows 9x alrendszer készült WSL9x néven a Linux kernel futtatásához

Retro Windows, modern Linux kernellel

A WSL9x jelenlegi formájában egy módosított Linux 6.19 kernelt használ, amely a Windows 9x kernelével párhuzamosan fut. Ennek eredményeként a Linux nem külön rendszerként indul újraindítás után, és nem is hagyományos virtuális gépként működik, hanem a régi Windows 9x környezeten belül kap futási lehetőséget. A projekt emiatt inkább rendszerszintű kísérletnek tekinthető, mintsem a modern Windowsokon megszokott WSL gyakorlati alternatívájának.

Hogyan működik?

A megoldás három fő részből áll. Az első egy User-Mode Linuxra épülő, módosított Linux kernel, amely POSIX API-k helyett a Windows 9x kernel API-jait hívja meg. A második elem egy VxD meghajtó, vagyis a Windows 9x korszakából ismert virtuális eszközmeghajtó. A harmadik komponens egy kisméretű DOS-kliens, a wsl.com, amely a Linux-terminált egy MS-DOS parancssori ablakhoz kapcsolja. Ez az összeállítás adja a WSL9x különlegességét, mert a Windows 95, 98 és ME még nem az NT-architektúrára épült, így eleve nem rendelkezik azokkal a modern kernel- és virtualizációs képességekkel, amelyekre a mai WSL alrendszer támaszkodik.

A WSL9x indulását a VxD meghajtó készíti elő. Ez hozza létre a Linux kernelkód kezdeti memórialeképezéseit, majd DOS-megszakításokkal tölti be a lemezről a vmlinux.elf állományt. A kernel rögzített, 0xd0000000 báziscímmel fordul, így a betöltési folyamat nem a modern rendszereknél megszokott dinamikus modellre épül. A meghajtó ezután új szálat indít a System VM-ben, 16 KiB méretű vermet foglal a Linuxba való belépéshez, majd egy eseménykezelő ciklusban vezérli a kernelbe lépést, a megszakítások továbbítását, a felhasználói térbe való visszatérést és az üresjárati állapotot.

A felhasználói térből érkező események kezelése szintén a VxD feladata. Jelenleg ide tartoznak a laphibák és a rendszerhívások. A Linux i386-os rendszerhívási mechanizmusa az int 0x80 megszakításra épül, a Windows 9x azonban nem kínál ehhez megfelelő hosszúságú interrupt descriptor table-t. Emiatt a WSL9x nem közvetlen megszakításkezelőt telepít, hanem az általános védelmi hiba, vagyis a general protection fault kezelőjén keresztül vizsgálja meg a hibát kiváltó utasítást. Ha ez int 0x80, a kezelő úgy lépteti tovább az utasításmutatót, mintha a megszakítás sikeresen lefutott volna, majd a hívást Linux-rendszerhívásként adja tovább.

A Linux-rész ugyan User-Mode Linuxból indul ki, de a WSL9x-ben nem klasszikus felhasználói módban fut. A kernel a Windows 9x API-jait hívja meg, és ring 0-ban, vagyis felügyelői/kernel módban dolgozik, nem pedig ring 3-ban. A Windows 9x-hez szükséges illesztés jelentős része, köztük a kontextusváltás kezelése is a módosított Linux kernelbe került. A wsl.com ehhez képest jóval kisebb komponens: egy 16 bites DOS-program, amely lehetővé teszi, hogy a WSL9x külön terminálimplementáció helyett az MS-DOS promptablakait használja TTY-ként.

A wsl.com induláskor lefoglal egy szabad konzolt, majd jelzi a WSL9x felé, hogy az adott konzol kimenetét hozzá kell irányítani. Ezután eseménykezelő ciklusban várja a megszakításokat, és megszakítás esetén megpróbál adatot olvasni a billentyűzetről. Amikor Linux felől kimenet érkezik, a konzolmeghajtó eseményt ütemez, majd az MS-DOS VM kontextusában az int 0x29 megszakítással írja ki a karaktereket a DOS-ablakba. Ugyanezen a ponton tud közbelépni egy DOS-os ANSI-meghajtó, például az NNANSI, amely az ANSI escape szekvenciák feldolgozását biztosítja.

Kiknek készült a WSL9x projekt?

A WSL9x elsősorban fejlesztőknek, retro hardverekkel kísérletező felhasználóknak és olyan érdeklődőknek készült, akik otthonosan mozognak az alacsony szintű szoftverek fordításában és tesztelésében. A projekt nem hétköznapi felhasználásra készült és közel sem kiforrott kompatibilitási réteg, és nem az a célja, hogy Windows 95 vagy Windows 98 alatt teljes értékű modern Linux-környezetet biztosítson.

Ennek ellenére a WSL9x figyelemre méltó technikai kísérlet, mivel modern Linux kernelt próbál működésre bírni a kilencvenes évek Windows-rendszerein. A Windows 9x kifejezés egyébként a Microsoft régi, otthoni felhasználásra készült 32 bites x86-os Windows-ágát foglalja össze, amelybe a Windows 95, a Windows 98 és a Windows ME tartozik. Ezek a rendszerek verziótól függően 386DX, 486 és Pentium gépeken is futottak. További részletek a projekt Github oldalán olvashatóak.