Hệ thống con Windows 9x dành cho Linux
(social.hails.org)- Một dự án thử nghiệm cho phép chạy nhân Linux mới nhất (6.19) theo kiểu hợp tác bên trong nhân Windows 9x, giúp tận dụng đồng thời toàn bộ tính năng của cả hai hệ điều hành
- Khác với WSL, dự án không dùng ảo hóa phần cứng nên có thể chạy cả trên 486
- Có thể sử dụng các tính năng OS hiện đại như phân trang, bảo vệ bộ nhớ, lập lịch ưu tiên ngắt trong môi trường Windows 9x, đồng thời hỗ trợ chạy ứng dụng song song mà không cần khởi động lại
- Gồm ba thành phần: nhân Linux đã vá, driver VxD và ứng dụng khách
wsl.com, với User-Mode Linux được chỉnh sửa để gọi API nhân Win9x - Các system call được điều phối qua trình xử lý lỗi bảo vệ chung (GPF) thay vì
int 0x80, do giới hạn bảng mô tả ngắt ngắn của Win9x - "Tự hào được viết mà không dùng AI (Proudly written without AI)", giấy phép GPL-3
WSL9x - codeberg.org/hails/wsl9x
Tổng quan
- WSL9x là hệ thống con Linux cho Windows 9x chạy nhân Linux mới nhất (tại thời điểm viết là 6.19) theo kiểu hợp tác bên trong nhân Windows 9x
- Có thể tận dụng đồng thời toàn bộ tính năng của cả hai hệ điều hành như phân trang, bảo vệ bộ nhớ, lập lịch ưu tiên ngắt
- Có thể chạy ứng dụng của cả hai OS song song mà không cần khởi động lại
- Được viết thủ công, không dùng AI
Cấu trúc kỹ thuật
- WSL9x gồm ba thành phần
- Nhân Linux đã vá (
win9x-um-6.19branch) - Driver VxD
- Chương trình khách
wsl.com
- Nhân Linux đã vá (
Driver VxD
- Phụ trách khởi tạo WSL9x, với điểm vào là
vxd/wsl9x.asm - Thiết lập ánh xạ ban đầu cho mã nhân và tải
vmlinux.elftừ đĩa thông qua ngắt DOS (vxd/loader.c,vxd/fs.asm) - Nhân được biên dịch với địa chỉ nền cố định
0xd0000000 - Khởi tạo một luồng mới trong System VM và cấp phát stack 16 KiB để dùng cho việc vào Linux
- Sau đó đi vào nhân, phân phối IRQ, quay lại user space và vào vòng lặp sự kiện xử lý trạng thái idle (
vxd/entry.c)
Xử lý system call và page fault
- Driver xử lý page fault và system call, là các sự kiện từ user space cần được điều phối tới nhân
- System call được xử lý qua trình xử lý lỗi bảo vệ chung (GPF)
- Win9x có bảng mô tả ngắt không đủ dài để cài một trình xử lý đúng nghĩa cho
int 0x80, là ngắt system call Linux i386 - Trình xử lý GPF kiểm tra lệnh gây lỗi, nếu là
int 0x80thì sẽ tăng con trỏ lệnh như thể ngắt đã thành công rồi điều phối sang system call Linux (vxd/fault.c)
- Win9x có bảng mô tả ngắt không đủ dài để cài một trình xử lý đúng nghĩa cho
Chỉnh sửa nhân Linux
- Dựa trên User-mode Linux, nhưng được sửa để gọi API nhân Windows 9x thay vì POSIX API
- Chạy ở ring 0 (supervisor/kernel mode) chứ không phải user mode (ring 3)
- Phần lớn việc tích hợp với nhân Win9x, bao gồm chuyển ngữ cảnh, nằm ở phía nhân Linux
- Vị trí mã chính:
linux/arch/um/os-Win95 - Điểm vào:
_starttrongmain.c, các tệp chính gồmprocess.c,mmu.c
- Vị trí mã chính:
Ứng dụng khách wsl.com
- Là chương trình DOS 16-bit được triển khai trong
wsl/wsl.asm - Cho phép tận dụng dấu nhắc MS-DOS làm cửa sổ TTY mà không cần triển khai TTY riêng
- Khi chạy, chương trình gọi WSL9x V86 API (
vxd/v86_api.asm) để xin cấp một console chưa dùng và yêu cầu đầu ra của console đó được điều phối về cho nó - Sau đó đi vào vòng lặp sự kiện chờ IRQ và thử đọc bàn phím khi có ngắt xảy ra
- Cũng đóng vai trò điểm đồng bộ hóa của driver console (
vxd/console.c)- Khi đầu ra Linux sẵn sàng, nó lên lịch một sự kiện và thực thi
int 0x29trong ngữ cảnh MS-DOS VM để in ký tự ra cửa sổ DOS - Ngắt này cũng là nơi các driver ANSI cho DOS như NNANSI chặn đầu ra terminal để triển khai mã thoát ANSI
- Khi đầu ra Linux sẵn sàng, nó lên lịch một sự kiện và thực thi
Yêu cầu build và chạy
- Cần cross toolchain cho đích
i386-linux-musl(khuyến nghị dùng musl-cross-make) - Cần Open Watcom v2 toolchain để build các thành phần Windows
- Cần build nhân Linux đã vá từ branch
win9x-um-6.19 - Thiết lập đúng các biến môi trường
WATCOMvàLINUX(xem ví dụ trong.envrc.example) - Cần ảnh đĩa cứng
hdd.base.imgvới Windows 9x đã được cài sẵn - Chạy
makesẽ tạohdd.imgđã chuẩn bị sẵn WSL9x - Chạy
wsltừ dấu nhắc MS-DOS để mở pty; nếu dùng màu ANSI thì nên nạp trước driver nhưnnansi.com
Giấy phép
- GPL-3
2 bình luận
Ý kiến trên Hacker News
http://www.colinux.org/
https://github.com/wishstudio/flinux
flinux trên thực tế khá gần với kiến trúc WSL1, còn CoLinux thì mang cảm giác giống WSL2 ở chỗ chở kernel Linux chạy bên cạnh
Về mặt kỹ thuật, tôi thấy Cygwin mới là con đường chính thống hơn. Thay vì cố nhét đường ống Linux từ bên ngoài vào, nó tiếp cận theo hướng chạy các binary POSIX native trên Windows, và tôi cũng thích điểm chỉ cần liên kết DLL nhẹ nhàng, không động tới ring 0
Dù vậy, hồi đó sự tiện lợi của các trình quản lý gói CLI còn thiếu, và khi thực sự làm việc trên Windows thì tôi đã dùng CoLinux khá nhiều
Vấn đề cốt lõi mà tôi nhớ là DLL hell. Ví dụ, nếu bản port OpenSSH cho Windows mang theo cygwin1.dll riêng của nó thì rất hay xảy ra xung đột phiên bản
Dù vậy, vào thời RAM ít và swap rất nặng, việc có ít overhead vẫn là một lợi thế đáng kể
Thời đó ứng dụng native mới là trung tâm chứ chưa phải Web 2.0 hay NodeJS, còn Java cũng không được đánh giá cao
Cuối cùng thì đúng như mọi khi, nó giống một dòng chảy kiểu tiến hai bước rồi lùi một bước
Trái với hàm ý rằng nó không chậm, trên thực tế nó vẫn chậm, tương thích kém hơn các cách khác, cần biên dịch lại, và trong phần lớn vòng đời của mình cũng không phải công cụ được yêu thích rộng rãi
Bên trong cygwin1.dll có rất nhiều ảo thuật tương thích, và rốt cuộc vẫn là kéo đường ống Linux từ bên ngoài vào trong tiến trình. Nhất là khi nghĩ tới cách nó hiện thực fork() mà không có hỗ trợ từ hệ thống thì lại càng như vậy
Cygwin hoàn toàn không chạy được trong vùng cô lập Windows AppContainer. MSYS2 đến giờ vẫn dùng nền tảng này, nên binary MSYS2 cũng không thể chạy trong AppContainer
Vì vậy khi sandboxing Claude Code, tôi đã phải đi theo một con đường hoàn toàn khác. Claude Code muốn dùng Git for Windows, mà Git for Windows lại phân phối bash.exe v.v. được build bằng MSYS2
Trong khi đó, các bản build Windows native thực sự không có những kiểu hack lạ mà cygwin1.dll yêu cầu, nên các bản build non-MSYS2 mà tôi tìm được đều chạy tốt trong AppContainer
Có thể dùng pacman của Arch Linux, nên việc xử lý các binary POSIX native trên Windows đã trở nên khá thân thiện ngay cả khi không có Linux VM
Nếu thư viện C mà bạn muốn dùng không có sẵn bản Cygwin được build trước, bạn phải tự chạy configure, make cho cả cây phụ thuộc
Thêm nữa, theo trí nhớ của tôi thì cỡ hai phần ba trường hợp là phải tự sửa gì đó, vì POSIX không hoàn toàn khớp một cách hoàn hảo
Nhưng để đạt đúng ngữ nghĩa thì phải dùng đủ loại đường vòng và hack, ví dụ fork không phải copy-on-write
Tôi đã dùng Cygwin từ khoảng năm 1999 đến 2022, cũng thử WSL2 một chút và bây giờ trên laptop tôi vẫn dùng nó
Còn desktop thì từ năm ngoái tôi đã chuyển hẳn sang Linux
Hồi còn dùng Windows thời XP, tôi từng chạy Colinux, và đó thực sự là một công cụ kỳ diệu
Việc dựng stack LAMP ở phía Linux dễ hơn nhiều, và bạn có thể biên tập bằng editor Windows trong khi vẫn tạo được một môi trường phát triển cục bộ khá ổn
Thậm chí còn có thể thử gắn X11 server cho Windows để dựng desktop Linux lên trên
Cứ nhìn bản thân dần dần chồng thêm môi trường giống Unix lên trên Windows như vậy, cuối cùng tôi đã chuyển hẳn sang macOS
Ngoài giá trị hack thuần túy, nếu nghĩ tới công dụng thực tế thì tôi cũng thấy có lẽ máy cấp 486 sẽ nhanh chóng chạm giới hạn bộ nhớ
http://colinux.org/
Chỉ là không nhiều người nhận ra điều đó mà thôi
Trong mắt tôi đây gần như là công việc bất khả thi
Nhưng tôi cũng tò mò không biết trong mắt những người hiểu cấu trúc hệ thống thì nó trông như thế nào
Thế là tôi nhớ tới câu đùa về hai nhà toán học bảo rằng một định lý là chuyện tầm thường, rồi phải giải thích hai tiếng sau mới thực sự thừa nhận là nó tầm thường
Thế là giáo sư cũng bảo đúng rồi và chuyển luôn sang phần tiếp theo
Thứ làm tôi thực sự khâm phục là tác giả đã lần lượt mò ra cả một danh sách chi tiết dài như sách khải huyền cần có để biến nó thành hiện thực
Vì thế mỗi chương trình chỉ có thể đọc một phần bộ nhớ của riêng nó, và CPU cũng chỉ được dùng trong một khoảng thời gian giới hạn trước khi nhường cho chương trình khác
Windows bắt đầu dùng những cơ chế đó một cách nghiêm túc từ Windows NT, và XP cũng thuộc cùng dòng đó
Trong khi đó, cho tới Windows 98 thì chương trình gần như có thể làm bất cứ điều gì, và các tính năng bảo vệ phần cứng kiểu đó hầu như bị bỏ không
Windows thời ấy, theo cảm nhận của tôi, gần với một gói thư viện chức năng để dựng UI và giao tiếp với thiết bị ngoại vi hơn là một hệ điều hành đúng nghĩa
CPU có phần cứng đặc biệt để giới hạn truy cập bộ nhớ và thời gian xử lý, nhưng Windows 9x đã không tận dụng đầy đủ
Vì vậy mới xuất hiện khoảng trống để một hệ thống con Linux cho Windows 9x tự đóng vai hệ điều hành, lấy các cơ chế phần cứng đó và chạy một hệ điều hành hiện đại bên trong
Theo tôi, phần khó nhất trong kiểu công việc này là lần ra API driver của Microsoft
Tài liệu thời 9x vừa không đủ chi tiết vừa không dễ tiếp cận, và đến giờ đây vẫn không phải lĩnh vực dễ chịu gì
Vì vậy có vẻ như lại có khá nhiều chỗ để cấy một phần chức năng mức thấp của Linux vào
Một bên là câu chuyện Show HN tăng gấp ba và đầy những ứng dụng mang cảm giác vibe coding na ná nhau, còn bên kia là có người đã đào sâu suốt 6 năm vào bên trong Win9x để chạy một kernel Linux hiện đại trong đó
So với những luồng thảo luận đầy app làm ra bằng prompt 20 phút, kiểu bài đăng này thực sự khiến tôi thấy vui
Thấy những câu như vậy thật sự khá thích
Bây giờ chuyện thường gặp là thay vì bảo create me an owl app thì người ta lại yêu cầu tạo một prompt tổng hợp để làm owl app, rồi dán nó vào một phiên AI khác
Vì thực ra có một sản phẩm tên là Zero AI, nên cũng có thể hiểu theo nghĩa đó
Cách diễn đạt cũng rõ hơn nhiều, và bản thân dự án thật sự rất đáng kinh ngạc
https://codeberg.org/hails/wsl9x
Chỉ để đọc một bài mà Mastodon vẫn bắt chạy JavaScript, nên tôi thường bỏ qua luôn
https://github.com/mastodon/mastodon/issues/23153
https://github.com/mastodon/mastodon/issues/19953
Tôi có biết vài mảnh thông tin như chuyện có VM Monitor và loại hỗ trợ kiểu này tồn tại, nhưng phần giải thích chi tiết thì cảm giác bị rải rác khắp nơi
Nhiều người tóm gọn Windows như chỉ chạy trên DOS, nhưng tôi thấy rõ ràng cách nói đó không chính xác
Tất nhiên nó không phải máy ảo theo nghĩa ngày nay, nhưng bên trong có khá nhiều cấu trúc kỹ thuật thú vị, trong khi đa số tài liệu dường như chỉ chạm rất nông vào phần đó
Tôi cũng tò mò dự án này giống BSD on Windows đến mức nào
Và tôi cũng biết Architecture of Windows 9x, nhưng theo gu của tôi thì nó chưa đủ sâu
https://winworldpc.com/product/windows-sdk-ddk/windows-95-ddk
Tài liệu rất chi tiết và có nhiều mã mẫu, rất hợp để tự đào sâu
Vì WSL nghĩa là Linux on Windows, nên cái này có lẽ được đọc là W9xSL theo nghĩa Linux trên Windows 9x
Giờ thì tôi chưa thể nêu bằng chứng ngay, nhưng tôi nhớ từng đọc đâu đó rằng chuyện này có liên quan tới vấn đề thương hiệu
Đại ý là họ vốn muốn gọi là Linux Subsystem for Windows, nhưng phía Linux foundation không cho phép một dự án không được ủy quyền dùng tên bắt đầu bằng Linux
Triết lý cốt lõi là có nhiều personality khác nhau, rồi dịch các system call của từng môi trường sang lời gọi kernel NT
Vì vậy WSL1 năm 2016, về cơ bản, chỉ là trò ảo thuật đó được triển khai lại cho Linux
Ngược lại, Windows 9x thuộc họ DOS, nên để chạy Linux trong đó hẳn phải cần kiểu hack bẩn hơn nhiều và khác biệt ở mức căn bản
Có lẽ đó cũng là lý do ngày xưa chẳng ai làm
Vì vậy, chỉ riêng việc nó thực sự chạy được cũng đã cho thấy kiến trúc NT đi trước thời đại tới mức nào
Nếu nghĩ tới ứng dụng thực tế thì tôi liên tưởng tới các môi trường bị trói vào Windows 98 như phần mềm y tế hay công nghiệp cũ
Tuy vậy, nếu vào năm 2026 mà bạn đang cầm một con 486 trên tay, thì rất có thể chạy Linux native sẽ hữu ích hơn nhiều so với việc nhét Linux vào trong một nhánh DOS 30 năm tuổi
Chỉ riêng việc Windows 9x có thể chạy DOS thôi cũng đã là một lượng phép màu đáng kể rồi
Tôi để lại vài bài đáng đọc liên quan
Ha, coLinux haha -_- cái tên thật đáng mừng. Haha. Nhưng giờ dù có WSL mình cũng không dùng, còn kiểu win95+linux này thì lại thấy cuốn đấy.