Subsystem do Windows 9x para Linux
(social.hails.org)- Projeto experimental que executa cooperativamente o kernel Linux mais recente (6.19) dentro do kernel do Windows 9x, permitindo usar ao mesmo tempo todos os recursos dos dois sistemas operacionais
- Ao contrário do WSL, não usa virtualização de hardware, então pode rodar até em um 486
- Recursos modernos de SO como paginação, proteção de memória e escalonamento preemptivo podem ser usados no ambiente Windows 9x, com suporte para executar aplicativos lado a lado sem reiniciar
- É composto por três elementos: kernel Linux com patches, driver VxD e cliente
wsl.com; o User-Mode Linux foi adaptado para chamadas à API do kernel Win9x - As chamadas de sistema são despachadas pelo manipulador de erro geral de proteção (GPF) em vez de
int 0x80, devido ao limite curto da tabela de descritores de interrupção do Win9x - "Orgulhosamente escrito sem IA", licença GPL-3
WSL9x - codeberg.org/hails/wsl9x
Visão geral
- O WSL9x é um subsistema Linux para Windows 9x que executa cooperativamente o kernel Linux mais recente dentro do kernel do Windows 9x (na época da escrita, 6.19)
- Permite aproveitar simultaneamente todos os recursos de ambos os sistemas operacionais, incluindo paginação, proteção de memória e escalonamento preemptivo
- Permite executar aplicativos dos dois sistemas lado a lado sem reiniciar
- Foi escrito manualmente, sem IA
Estrutura técnica
- O WSL9x é composto por três componentes
- Kernel Linux com patches (branch
win9x-um-6.19) - Driver VxD
- Programa cliente
wsl.com
- Kernel Linux com patches (branch
Driver VxD
- É responsável pela inicialização do WSL9x, com ponto de entrada em
vxd/wsl9x.asm - Configura o mapeamento inicial do código do kernel e carrega
vmlinux.elfdo disco por meio de interrupções do DOS (vxd/loader.c,vxd/fs.asm) - O kernel é compilado com endereço base fixo em
0xd0000000 - Inicia uma nova thread dentro da System VM e aloca uma pilha de 16 KiB para a entrada do Linux
- Depois entra em um loop de eventos que trata a entrada no kernel, o despacho de IRQ, o retorno ao espaço do usuário e o estado ocioso (
vxd/entry.c)
Tratamento de chamadas de sistema e page fault
- O driver trata page faults e chamadas de sistema, que são eventos do espaço do usuário e precisam ser despachados para o kernel
- As chamadas de sistema são tratadas pelo manipulador de erro geral de proteção (GPF)
- O Win9x não tem uma tabela de descritores de interrupção longa o suficiente para instalar um manipulador adequado para
int 0x80, a interrupção de chamadas de sistema do Linux i386 - O manipulador de GPF inspeciona a instrução que causou a falha e, se for
int 0x80, avança o ponteiro de instrução como se a interrupção tivesse sido bem-sucedida e despacha para a chamada de sistema do Linux (vxd/fault.c)
- O Win9x não tem uma tabela de descritores de interrupção longa o suficiente para instalar um manipulador adequado para
Modificações no kernel Linux
- É baseado em User-mode Linux, mas foi modificado para chamar a API do kernel do Windows 9x em vez da API POSIX
- Roda em ring 0 (modo supervisor/kernel), não em modo usuário (ring 3)
- Grande parte da integração com o kernel Win9x, incluindo troca de contexto, fica do lado do kernel Linux
- Principais arquivos:
linux/arch/um/os-Win95 - Ponto de entrada:
_startemmain.c; arquivos principais incluemprocess.cemmu.c
- Principais arquivos:
Cliente wsl.com
- É um programa DOS de 16 bits implementado em
wsl/wsl.asm - Permite usar o prompt do MS-DOS como janela TTY sem implementar um TTY separado
- Ao ser executado, chama a API V86 do WSL9x (
vxd/v86_api.asm) para receber um console não utilizado e informar que a saída desse console deve ser despachada para ele - Depois entra em um loop de eventos aguardando IRQ e tenta ler o teclado quando uma interrupção ocorre
- Também funciona como ponto de sincronização do driver de console (
vxd/console.c)- Quando a saída do Linux está pronta, agenda um evento e executa
int 0x29no contexto da VM do MS-DOS para imprimir caracteres na janela do DOS - Essa interrupção também é o ponto em que drivers ANSI para DOS, como o NNANSI, interceptam a saída do terminal para implementar códigos de escape ANSI
- Quando a saída do Linux está pronta, agenda um evento e executa
Requisitos para build e execução
- É necessário um toolchain cross para o alvo
i386-linux-musl(recomendado usar musl-cross-make) - É necessário o toolchain Open Watcom v2 para compilar os componentes Windows
- É necessário compilar o kernel Linux com patches na branch
win9x-um-6.19 - Defina corretamente as variáveis de ambiente
WATCOMeLINUX(veja o exemplo em.envrc.example) - É necessária uma imagem de disco rígido
hdd.base.imgcom o Windows 9x pré-instalado - Ao executar
make, será gerada a imagemhdd.imgcom o WSL9x preparado - Execute
wslno prompt do MS-DOS para abrir o pty; para usar cores ANSI, recomenda-se carregar antes um driver comonnansi.com
Licença
- GPL-3
2 comentários
Comentários do Hacker News
http://www.colinux.org/
https://github.com/wishstudio/flinux
O flinux era, na prática, mais próximo da arquitetura do WSL1, enquanto o CoLinux lembrava mais o WSL2 por carregar um kernel Linux ao lado
Tecnicamente, eu achava o Cygwin uma abordagem mais ortodoxa. Em vez de forçar um encanamento Linux externo, ele rodava binários POSIX nativos sobre o Windows, e eu gostava do fato de terminar só com um link leve de DLL, sem mexer no ring 0
Só que, na época, faltava a praticidade de um gerenciador de pacotes de linha de comando, e na prática eu usava bastante o CoLinux quando trabalhava no Windows
O principal problema de que me lembro era o DLL hell. Por exemplo, quando um port do OpenSSH para Windows trazia sua própria
cygwin1.dll, conflitos de versão eram frequentesAinda assim, na época em que RAM era escassa e swap era pesado, o menor overhead fazia diferença
Naqueles tempos, antes de Web 2.0 ou NodeJS dominarem, o foco era em apps nativos, e Java também não tinha boa reputação
No fim, parecia aquele movimento de sempre: dois passos para a frente e um para trás
Apesar da insinuação de que não era lento, na prática era lento, tinha menos compatibilidade que outras opções, exigia recompilação e, durante a maior parte da sua vida, não foi uma ferramenta amplamente adorada
Dentro da
cygwin1.dllacontecia uma enorme mágica de compatibilidade, e no fim das contas isso também era uma forma de puxar um encanamento Linux externo para dentro do processo. Isso fica ainda mais claro quando se pensa em como eles implementavamfork()sem suporte do sistemaO Cygwin simplesmente não funciona dentro do isolamento do Windows AppContainer. O MSYS2 também usa essa base até hoje, então binários do MSYS2 não rodam em AppContainer
Por isso, no sandboxing do Claude Code, tivemos que seguir um caminho totalmente diferente. O Claude Code depende do Git for Windows, e o Git for Windows distribui
bash.exee outros componentes compilados com MSYS2Já builds realmente nativos para Windows não precisam daqueles hacks peculiares exigidos pela
cygwin1.dll, então os builds non-MSYS2 que encontrei rodaram bem no AppContainerComo dá para usar o
pacmando Arch Linux, ficou bem mais amigável lidar com binários POSIX nativos no Windows sem precisar de uma VM LinuxSe a biblioteca C que você queria usar não tivesse uma versão para Cygwin já pronta, era preciso sair rodando
configureemakemanualmente por toda a árvore de dependênciasE, se não me falha a memória, em uns dois terços das vezes ainda era necessário corrigir alguma coisa na mão, porque a compatibilidade POSIX não era perfeita
Mesmo assim, era preciso recorrer a todo tipo de gambiarra e hack para acertar a semântica correta; por exemplo,
forknão era copy-on-writeEu usei Cygwin de mais ou menos 1999 até 2022, experimentei um pouco o WSL2 e ainda uso isso no notebook
Mas no desktop migrei totalmente para Linux no ano passado
Lá atrás, na era do XP, eu rodava Colinux no Windows, e era uma ferramenta realmente fascinante
Era muito mais fácil subir uma stack LAMP no lado Linux, e dava para montar um ambiente de desenvolvimento local bem decente editando com ferramentas do Windows
Também dava para experimentar ligar um servidor X11 para Windows e exibir um desktop Linux por cima
Em algum momento, vendo que eu estava empilhando cada vez mais um ambiente estilo Unix sobre o Windows, acabei migrando para macOS
Fora o puro valor de hacking, pensando em utilidade prática, imagino que em máquinas da classe 486 isso bateria rápido no limite de memória
http://colinux.org/
Só faltou mais gente perceber isso
Para mim, isso soa como um trabalho quase impossível
Mas fiquei curioso sobre como isso pareceria aos olhos de quem entende a arquitetura
Aí me veio aquela piada sobre dois matemáticos dizendo que um teorema é trivial e, depois de duas horas explicando, finalmente admitindo que ele realmente é trivial
O professor concordou e seguimos em frente
O que realmente impressiona é que a autora ou autor foi identificando, um por um, todos os itens daquela longa lista de detalhes digna de um grimório que tornam isso possível
Por isso, cada programa só pode ler uma parte da própria memória, e a CPU também só fica disponível por um tempo limitado antes de passar para o próximo programa
O Windows passou a usar isso de forma séria a partir do Windows NT, e o XP também faz parte dessa linhagem
Já até o Windows 98, os programas podiam fazer praticamente qualquer coisa, e aqueles mecanismos de proteção do hardware ficavam quase sem uso
Naquela época, o Windows parecia mais um conjunto de bibliotecas utilitárias para exibir a UI e conversar com periféricos do que um sistema operacional no sentido moderno
A CPU tem hardware especial para limitar acesso à memória e tempo de processamento, mas o Windows 9x não aproveitava isso plenamente
Por isso, existia espaço para um subsistema Linux para Windows 9x fingir que era ele mesmo o sistema operacional, tomar posse desse hardware e rodar um sistema moderno ali dentro
Na minha visão, a parte mais difícil num trabalho desses é descobrir a API de drivers da Microsoft
A documentação da era 9x não era detalhada o suficiente, nem fácil de acessar, e até hoje isso não é uma área muito agradável
Então parecia haver bastante espaço para encaixar ali parte das funcionalidades de baixo nível do Linux
De um lado, havia discussão sobre como os Show HN triplicaram e como está cheio de apps com uma vibezinha parecida de vibe coding; do outro, alguém estava há 6 anos fuçando as entranhas do Win9x para rodar um kernel Linux moderno ali dentro
Comparando com threads cheias de apps feitos com prompt de 20 minutos, posts assim dão uma alegria genuína
Gostei bastante de ver isso
Em vez de pedir
create me an owl app, muita gente agora pede um prompt abrangente para criar um owl app e depois cola isso em outra sessão de IAPorque existe mesmo um produto chamado Zero AI, então também dá para ler assim
A formulação ficou muito melhor, e o projeto em si também é realmente impressionante
https://codeberg.org/hails/wsl9x
O Mastodon ainda exige execução de JavaScript até para ler um único post, então eu normalmente só ignoro
https://github.com/mastodon/mastodon/issues/23153
https://github.com/mastodon/mastodon/issues/19953
Eu conheço pedaços soltos, como a existência do VM Monitor e esse tipo de suporte, mas sinto que as explicações detalhadas estão espalhadas por toda parte
Muita gente resume o Windows como se ele simplesmente rodasse sobre o DOS, mas isso claramente não é exato
Claro, não é uma máquina virtual no sentido atual, mas havia ali uma estrutura técnica bem interessante, e a maior parte do material parece tratar isso só superficialmente
Também tenho curiosidade sobre o quanto este projeto se parece com BSD on Windows
E também conheço Architecture of Windows 9x, mas para o meu gosto achei pouco profundo
https://winworldpc.com/product/windows-sdk-ddk/windows-95-ddk
A documentação é bem detalhada e há muito código de exemplo, ótimo para estudar a fundo
Como WSL significa Linux on Windows, isto aqui também parece ser lido como W9xSL no sentido de Linux sobre Windows 9x
Não consigo citar a fonte agora, mas lembro de ter lido que isso tinha relação com questões de marca
A ideia original seria chamar de Linux Subsystem for Windows, mas a Linux Foundation não permitiria que um projeto não autorizado usasse um nome começando com Linux, algo nessa linha
A filosofia central era ter múltiplas personalities, com cada ambiente traduzindo suas chamadas de sistema para chamadas do kernel NT
Então o WSL1, em 2016, foi basicamente uma reimplementação do mesmo truque, só que para Linux
Já o Windows 9x vinha da linhagem do DOS, então rodar Linux ali dentro provavelmente exigia hacks muito mais sujos e fundamentalmente diferentes
Imagino que esse seja o motivo de ninguém ter feito isso na época
Por isso, o simples fato de isso funcionar já parece mostrar o quanto a arquitetura NT estava à frente do seu tempo
Em termos práticos, penso em ambientes presos ao Windows 98, como softwares médicos ou industriais antigos
Ainda assim, se alguém estiver com um 486 nas mãos em 2026, provavelmente será muito mais útil simplesmente rodar Linux nativo do que enfiar Linux dentro de um derivado de DOS com 30 anos
O simples fato de o Windows 9x conseguir rodar DOS já envolvia uma boa dose de mágica
Deixo também algumas leituras relacionadas
Ah, coLinux kkk -_- que nome nostálgico. kkk Mas hoje em dia nem uso o WSL mesmo tendo ele, porém esse win95+linux me chama a atenção.