WSL9x: Linux dentro Windows 95 e 98, l'hack geniale che sfida i limiti dei sistemi anni '90

WSL9x (Windows 9x Subsystem for Linux) integra un kernel Linux moderno in Windows 95 e Windows 98 tramite driver VxD e tecniche low-level, permettendo co-esecuzione senza riavvio.

Negli anni ’90, l’idea di integrare Windows con Linux poteva sembrare qualcosa di fantascientifico. Erano come il diavolo e l’acqua santa, due poli opposti, due sistemi che parlavano lingue incompatibili e non avevano alcuna intenzione di tradursi a vicenda. Le due piattaforme nascevano con obiettivi, architetture e filosofie profondamente diversi: da un lato Windows 9x, costruito su fondamenta ibride tra 16 e 32 bit e fortemente legato a MS-DOS; dall’altro Linux, già orientato a un modello Unix-like con gestione rigorosa della memoria, isolamento dei processi e multitasking preemptive.

Windows 95 e 98 offrivano una compatibilità ampia con l’hardware consumer, ma pagavano questo vantaggio con una stabilità limitata. Linux, invece, cresceva rapidamente nei contesti server e accademici, dove affidabilità e controllo contavano più della facilità d’uso. Mettere insieme questi due mondi, all’epoca, non era semplicemente difficile: mancavano proprio gli strumenti concettuali e tecnici per farlo.

Windows-Linux: dallo scontro ideologico all’integrazione tecnica

A rendere il quadro ancora più netto contribuì anche la posizione di Microsoft in quegli anni. Celebre la terribile dichiarazione di Steve Ballmer, che definì Linux un “cancro” in riferimento al modello di licensing open source. Era una presa di posizione dura, che rifletteva una visione competitiva e incompatibile tra i due mondi: Windows da una parte, Linux dall’altra, senza alcuna reale possibilità di convergenza.

Il cambio di rotta arriva molto più tardi, quando Microsoft inizia a rivedere il proprio approccio verso l’open source. Linux e centinaia di progetti open source, nel rispetto delle licenze, diventano il carburante della piattaforma cloud Microsoft Azure contribuendo a determinarne il successo. Tanto che sotto l’egida di Satya Nadella, la comunicazione aziendale si trasforma in modo quasi opposto rispetto al passato, sintetizzata nello slogan “Microsoft ama Linux“, utilizzato per promuovere il nuovo corso.

Un’ulteriore svolta arriva con iniziative come Windows Subsystem for Linux (WSL), introdotto inizialmente in Windows 10. Arriva un’integrazione profonda che consente di eseguire binari Linux direttamente su Windows, con la possibilità di avere collegamenti ai programmi Linux sulla barra delle applicazioni, nel menu Start e in altre aree del sistema operativo Microsoft.

WSL9x: Linux arriva su Windows 95 e Windows 98

WSL9x: Linux arriva anche sui sistemi Windows 95 e Windows 98

Far convivere un kernel Linux moderno con Windows 9x sembra un esercizio di retrocomputing, invece racconta molto di come si possano plasmare architetture nate con limiti evidenti.

Il progetto WSL9x parte proprio da qui: inserire un kernel Linux recente – versione 6.19 al momento della scrittura – dentro un ambiente Windows 95/98/ME, sfruttando meccanismi che quei sistemi non avevano mai pensato di supportare fino in fondo.

Il risultato non è un semplice esperimento accademico, ma un sistema ibrido funzionante che permette di eseguire applicazioni Linux accanto ai programmi Win32 senza riavviare la macchina. Considerando che Windows 9x nasce negli anni ’90 con un modello di memoria fragile e una gestione limitata della protezione, l’operazione assume un interesse tecnico concreto.

WSL9x si articola in tre elementi distinti ma strettamente integrati: un kernel Linux modificato, un driver VxD e un client utente chiamato wsl.com.

Il driver VxD rappresenta il punto di ingresso dell’intero sistema. Negli ambienti Windows 9x, infatti, i VxD operano a livello kernel e possono interagire direttamente con l’hardware e con la memoria. Il driver inizializza WSL9x, imposta le mappature di memoria necessarie e carica il kernel Linux da disco utilizzando interrupt DOS.

Il kernel Linux è compilato con un indirizzo base fisso (0xd0000000) in maniera tale da evitare conflitti con lo spazio di indirizzamento già occupato dal sistema Windows e consentire una gestione più prevedibile delle pagine di memoria. Windows 9x non gestisce la memoria virtuale con la stessa rigidità dei sistemi della famiglia NT; quindi, fissare l’indirizzo diventa una necessità più che una scelta.

Gestione dell’esecuzione e scheduling cooperativo

Dopo l’avvio, il driver crea un thread, cioè un flusso di esecuzione indipendente, all’interno della macchina virtuale di sistema (System VM) e riserva uno stack di 16 KB, una porzione di memoria usata per gestire chiamate e variabili locali, necessario per entrare nel kernel Linux.

Da questo punto parte un ciclo continuo di eventi che regola il dialogo tra i due ambienti: ingresso nel kernel Linux, gestione degli interrupt hardware (segnali generati dai dispositivi), ritorno allo spazio utente (dove girano le applicazioni) e periodi di inattività.

Il funzionamento è cooperativo, ma non nel senso tradizionale dei sistemi non preemptive, in cui i processi cedono volontariamente il controllo. Linux utilizza comunque un proprio scheduler preemptive, cioè un meccanismo che può interrompere i processi per assegnare la CPU ad altri, mentre Windows 9x continua a controllare il resto del sistema.

Il driver VxD agisce come coordinatore, stabilendo quando il controllo deve passare da un kernel all’altro. Con WSL9x Linux non rimpiazza il kernel di Windows, ma opera in parallelo come un sistema affiancato che riceve tempo di CPU e gestisce autonomamente i propri processi.

Il risultato è notevole: è possibile eseguire contemporaneamente applicazioni Linux e Win32 senza dover riavviare il computer.

Gestione delle system call e delle eccezioni

Uno degli aspetti più interessanti riguarda la gestione delle system call Linux: l’autore di WSL9x ricorda che sui sistemi i386 classici, queste avvengono tramite l’interrupt 0x80. Windows 9x, però, non dispone di una interrupt descriptor table sufficientemente estesa per intercettare direttamente questo meccanismo.

La soluzione adottata è particolarmente sofisticata: sfrutta il gestore dei general protection fault, ossia l’eccezione generata quando un programma esegue un’operazione non consentita o accede a risorse in modo non valido.

Quando viene eseguita l’istruzione int 0x80, si produce un’eccezione che viene intercettata dal driver. Il driver VxD esamina quindi l’istruzione che ha causato il problema e, se identifica una chiamata di sistema tipica di Linux, aggiorna il puntatore delle istruzioni come se tutto fosse avvenuto regolarmente e inoltra la richiesta al kernel Linux.

Un meccanismo analogo è applicato anche ai page fault, che sono errori generati quando un programma tenta di accedere a una porzione di memoria non disponibile o non ancora caricata: in questi casi, se la memoria coinvolta appartiene al kernel Linux, la gestione è delegata a quest’ultimo.

Limiti, implicazioni e valore tecnico

WSL9x dimostra che anche piattaforme considerate obsolete possono ospitare tecnologie moderne, ma evidenzia anche i limiti strutturali di Windows 9x. L’assenza di isolamento reale tra processi e la fragilità del kernel rendono il sistema instabile in scenari complessi.

Il valore principale non sta nell’uso pratico, ma nella comprensione dei meccanismi interni dei sistemi operativi: chi lavora su kernel, hypervisor o compatibilità legacy può trovare in WSL9x una miniera di spunti concreti.

Il progetto dimostra inoltre che anche ai tempi di Windows 95 e Windows 98 si sarebbe potuta sviluppare con successo un’integrazione efficace con Linux, se solo i vertici Microsoft ne avessero intuito l’importanza. E ciò non tanto sui sistemi consumer ma su Windows NT e derivati.

Ti consigliamo anche

Link copiato negli appunti