- Windows 9x 커널 안에서 최신 Linux 커널(6.19) 을 협력적으로 구동시켜 두 운영체제의 전체 기능을 동시에 활용 가능하게 하는 실험적 프로젝트
- WSL과 달리 하드웨어 가상화를 사용하지 않아서, 486에서도 실행가능
- 페이징, 메모리 보호, 선점형 스케줄링 등 현대적 OS 기능을 Windows 9x 환경에서 사용 가능하며, 재부팅 없이 애플리케이션을 나란히 실행 지원
- 패치된 Linux 커널, VxD 드라이버, wsl.com 클라이언트 세 가지 구성요소로 이뤄지며, User-Mode Linux를 Win9x 커널 API 호출로 개조
- 시스템콜은 Win9x의 짧은 인터럽트 디스크립터 테이블 한계로 int 0x80 대신 일반 보호 오류(GPF) 핸들러를 통해 디스패치
- "AI 없이 자랑스럽게 작성됨(Proudly written without AI)", GPL-3 라이선스
WSL9x - codeberg.org/hails/wsl9x
개요
- WSL9x는 Windows 9x 커널 내부에서 최신 Linux 커널(작성 시점 6.19)을 협력적으로 실행시키는 Windows 9x용 Linux 서브시스템
- 페이징, 메모리 보호, 선점형 스케줄링 등 양쪽 운영체제의 전체 기능을 동시에 활용 가능
- 재부팅 없이 양 OS의 애플리케이션을 나란히 실행 가능
- AI 없이 직접 작성됐음
기술적 구조
- WSL9x는 세 가지 구성요소로 이뤄짐
- 패치된 Linux 커널 (win9x-um-6.19 브랜치)
- VxD 드라이버
- wsl.com 클라이언트 프로그램
VxD 드라이버
- WSL9x의 초기화를 담당하며, 진입점은 vxd/wsl9x.asm
- 커널 코드의 초기 매핑을 설정하고 DOS 인터럽트를 통해 vmlinux.elf를 디스크에서 로드 (vxd/loader.c, vxd/fs.asm)
- 커널은 고정 베이스 주소 0xd0000000 으로 컴파일
- System VM 내에 새 스레드를 시작하고 16 KiB 스택을 할당해 Linux 진입용으로 사용
- 이후 커널 진입, IRQ 디스패치, 유저스페이스 복귀, 아이들 상태를 처리하는 이벤트 루프로 진입 (vxd/entry.c)
시스템콜과 페이지 폴트 처리
- 드라이버는 커널에 디스패치되어야 하는 유저스페이스 이벤트인 페이지 폴트와 시스템콜을 처리
- 시스템콜은 일반 보호 오류(GPF) 핸들러를 통해 처리됨
- Win9x는 Linux i386 시스템콜 인터럽트인 int 0x80에 대한 제대로 된 핸들러를 설치할 만큼 인터럽트 디스크립터 테이블이 길지 않음
- GPF 핸들러가 폴트 발생 명령을 검사하여 int 0x80이면 인터럽트가 성공한 것처럼 명령 포인터를 진행시키고 Linux 시스템콜로 디스패치 (vxd/fault.c)
Linux 커널 개조
- User-mode Linux 기반이지만, POSIX API 대신 Windows 9x 커널 API를 호출하도록 수정됨
- 유저 모드(ring 3)가 아니라 ring 0 (슈퍼바이저/커널 모드) 에서 실행
- 컨텍스트 스위칭을 포함한 Win9x 커널 통합의 상당 부분이 Linux 커널 측에 존재
- 주요 코드 위치: linux/arch/um/os-Win95
- 진입점: main.c의 _start, 주요 파일로 process.c, mmu.c
wsl.com 클라이언트
- 16비트 DOS 프로그램으로 wsl/wsl.asm에 구현됨
- 별도 TTY 구현 없이 MS-DOS 프롬프트를 TTY 창으로 활용 가능하게 함
- 실행 시 WSL9x V86 API (vxd/v86_api.asm)를 호출해 사용되지 않는 콘솔을 할당받고, 해당 콘솔의 출력이 자신에게 디스패치되도록 알림
- 이후 IRQ를 기다리며 인터럽트 발생 시 키보드 읽기를 시도하는 이벤트 루프로 진입
- 콘솔 드라이버(vxd/console.c)의 동기화 포인트 역할도 수행
- Linux 출력이 준비되면 이벤트를 스케줄링하고, MS-DOS VM 컨텍스트에서 int 0x29를 실행하여 DOS 창에 문자 출력
- 이 인터럽트는 NNANSI 같은 DOS용 ANSI 드라이버가 ANSI 이스케이프 코드 구현을 위해 터미널 출력을 가로채는 지점이기도 함
빌드 및 실행 요구사항
- i386-linux-musl 타깃의 크로스 툴체인 필요 (musl-cross-make 사용 권장)
- Windows 구성요소 빌드를 위한 Open Watcom v2 툴체인 필요
- win9x-um-6.19 브랜치에서 패치된 Linux 커널 빌드 필요
- WATCOM과 LINUX 환경변수를 적절히 설정 (예시는 .envrc.example 참조)
- Windows 9x가 사전 설치된 하드디스크 이미지 hdd.base.img 필요
- make 실행 시 WSL9x가 준비된 hdd.img 생성
- MS-DOS 프롬프트에서 wsl 실행으로 pty 개방, ANSI 컬러 사용 시 nnansi.com 같은 드라이버를 사전 로드 권장
라이선스
- GPL-3

4 hours ago
2







English (US) ·