- Một hệ điều hành thử nghiệm dựa trên giao diện đồ họa, được triển khai hoàn toàn bằng Rust, sử dụng thiết kế unikernel và mô hình bảo mật sandboxing dựa trên WASM
- Kernel, engine WASM và toàn bộ ứng dụng được nhúng trong một tệp nhị phân EFI, mang lại cấu trúc tối giản và giao diện system call độc đáo
- Chạy trên QEMU thông qua driver dựa trên VirtIO, trong đó quản lý input, mạng và GPU được triển khai bằng cơ chế polling không dùng interrupt
- Hỗ trợ cấu trúc vận hành đơn giản hóa và khả năng giám sát tài nguyên theo từng ứng dụng thông qua vòng lặp sự kiện toàn cục và cooperative scheduling
- Cung cấp UI toolkit Uitk riêng và các ứng dụng tích hợp sẵn (trình duyệt web, trình soạn thảo văn bản, terminal Python), đồng thời có thể phát triển ứng dụng WASM bằng nhiều ngôn ngữ
Munal OS là gì
- Munal OS là một hệ điều hành thử nghiệm được phát triển hoàn toàn bằng Rust, là dự án được tạo ra để khám phá một thiết kế OS mới bằng cách kết hợp kiến trúc dựa trên unikernel với sandboxing WASM
- Mục tiêu là giảm độ phức tạp, chỉ áp dụng các thành phần thiết yếu để hiện thực một cấu trúc hệ thống tinh gọn bằng các công cụ hiện đại
Tính năng chính
- Hỗ trợ môi trường đồ họa đầy đủ và độ phân giải HD, kèm giao diện chuột và bàn phím
- Chạy ứng dụng theo mô hình sandbox, ngăn ứng dụng người dùng truy cập bộ nhớ kernel
- Tích hợp driver mạng và stack TCP riêng
- Bao gồm UI toolkit (Uitk) có thể tùy biến, hỗ trợ nhiều widget, bố cục linh hoạt và kết xuất văn bản
- Ứng dụng mặc định: trình duyệt web (hỗ trợ DNS, HTTPS, HTML cơ bản), trình soạn thảo văn bản, terminal Python
Kiến trúc
-
Cấu trúc dựa trên tệp nhị phân EFI
- Chạy dưới dạng tệp nhị phân EFI không cần bootloader, với kernel/engine WASM/ứng dụng được nhúng trong một tệp duy nhất
- UEFI boot services được kết thúc trong thời gian ngắn nhất có thể, không được sử dụng thêm ngoài đồng hồ hệ thống
-
Quản lý không gian địa chỉ
- Không sử dụng không gian địa chỉ ảo, giữ nguyên địa chỉ identity-mapped do UEFI để lại
- Không thay đổi page table. Việc bảo vệ trực tiếp bộ nhớ kernel được bù đắp bằng sandboxing WASM
-
Driver và hỗ trợ phần cứng
- Thay vì PS/2 hay VGA, hệ thống tự triển khai trực tiếp driver PCI sử dụng đặc tả VirtIO 1.1
- Cung cấp driver cho bàn phím, chuột, mạng và GPU
- Không sử dụng interrupt, tất cả driver đều được thiết kế theo cơ chế polling
- Chưa hỗ trợ chạy trên phần cứng thực ngoài QEMU, cần phát triển thêm trong tương lai
-
Vòng lặp sự kiện và lập lịch
- Không hỗ trợ đa nhân/interrupt, toàn bộ hệ thống chạy tuần tự trong một vòng lặp sự kiện toàn cục duy nhất
- Mỗi vòng lặp sẽ polling driver mạng/input, chạy UI desktop và ứng dụng, rồi cập nhật framebuffer GPU
- Dễ phân tích hiệu năng, có thể đo thời gian theo từng chu kỳ vòng lặp
- Ứng dụng phải tự giải phóng quyền chiếm CPU, các tác vụ dài cần chủ động nhường quyền thực thi
- Dựa trên cooperative scheduling, đồng thời có thể hỗ trợ buộc dừng ứng dụng lỗi nhờ tính năng fuel limit của engine Wasmi (chưa triển khai)
Cấu trúc thực thi ứng dụng
- Tích hợp [Wasmi WASM engine], cung cấp sandboxing hoàn toàn và tách biệt với kernel khi chạy ứng dụng
- Cung cấp API system call ở cấp kernel, cho phép ứng dụng truy vấn sự kiện chuột/phím, sử dụng TCP socket, xuất ra framebuffer, v.v.
- Kết quả render của ứng dụng được OS compositing rồi hiển thị lên desktop
- Có thể tạo ứng dụng bằng nhiều ngôn ngữ ngoài Rust, miễn là hỗ trợ build sang WASM
- Tương thích WASI ở mức một phần. Không tuân thủ hoàn toàn, chỉ bao gồm mức triển khai tối thiểu để dùng các phụ thuộc bên ngoài quan trọng
- Mỗi ứng dụng có luồng log riêng (tương tự stdout), có thể xem cùng mức sử dụng tài nguyên trong chế độ “audit” của desktop
UI toolkit (uitk)
- Bộ UI kit immediate-mode riêng, được dùng cả trong Munal OS lẫn các ứng dụng WASM
- Cung cấp widget cơ bản (nút bấm, thanh tiến trình, chỉnh sửa văn bản, canvas cuộn) và bộ rasterizer tam giác
- Kiểu dáng thống nhất dựa trên global stylesheet, đồng thời hỗ trợ override cho từng phần tử riêng lẻ
- Hệ thống cache hiệu quả giúp tránh render lại không cần thiết
- Chia theo từng “tile” của mỗi vùng, với thuật toán phát hiện thay đổi dựa trên quy tắc mutability của Rust
Môi trường build và chạy
- Có thể build và chạy với Rust Nightly 2025-06-01 và QEMU 10.0.0 trở lên
Tài liệu tham khảo chính và credit
- Rust OS tutorial của Philipp Oppermann và tài liệu từ OSDev Wiki
- Sử dụng nhiều dự án mã nguồn mở quan trọng như Wasmi, smoltcp, Rustls, RustPython
- Sử dụng nhiều phông chữ, biểu tượng và tài nguyên hình nền mã nguồn mở
Ý nghĩa và ưu điểm của Munal OS
- Kết hợp cấu trúc tệp nhị phân EFI đơn nhất với sandboxing mang tính đổi mới, gợi mở việc xem xét lại mô hình thiết kế OS truyền thống
- Tối ưu cho môi trường QEMU cùng cấu trúc driver dựa trên polling độc đáo, giảm thiểu phụ thuộc vào phần cứng hệ thống thực
- Tính minh bạch trong quản lý tài nguyên hệ thống, cùng giá trị học tập và thử nghiệm lớn nhờ cấu trúc đơn giản
- Có tiềm năng lớn để mở rộng hệ sinh thái ứng dụng WASM mà không bị ràng buộc bởi ngôn ngữ hay môi trường
1 bình luận
Ý kiến trên Hacker News
Thấy thú vị với cấu trúc mỗi vòng lặp sẽ polling mạng và driver đầu vào, vẽ giao diện desktop, chạy một bước cho từng ứng dụng WASM đang hoạt động rồi flush framebuffer của GPU. Tôi đã tìm mã vì muốn biết họ triển khai phần này bằng Wasmi như thế nào liên kết mã GitHub. Muốn lưu ý rằng trong Wasmi mới nhất (v0.45+), khả năng gọi hàm có thể resume đã được mở rộng để có thể yield khi hết fuel liên kết tài liệu Wasmi. Vì đã dùng fuel metering rồi, đây có thể là cách hiệu quả hơn ở bước thực thi. Có thể xem ví dụ áp dụng trong ví dụ Wasmi Wast runner
try/catchsao? Nếu sau khi thất bại vẫn phải thử lạimallocmột cách tường minh thì tôi hơi bối rối vì chưa thấy khác biệt đủ rõCó nhắc rằng vì phụ thuộc vào VirtIO nên Munal OS hiện chưa chạy được trên phần cứng thực. Nếu muốn vận hành trên phần cứng thật thì thay vì tự thêm driver trực tiếp, dùng Linux làm bootloader rồi chạy hệ điều hành trong một hypervisor tối giản cũng là một hướng đi thú vị. Cách này giúp giữ được khái niệm “VirtIO là nền tảng”. Chọn WASM cho việc chạy ứng dụng và VirtIO cho nền tảng là một bản sắc khá hay. Nhưng xét về bảo mật thì vẫn cần dùng MMU. Về mặt thiết kế có thể chưa cần tới bộ nhớ ảo đầy đủ, nhưng để dùng các bit bảo vệ thì vẫn phát sinh thêm độ phức tạp như quản lý page table và TLB, làm suy giảm phần nào sự đơn giản
Tôi nghĩ nhược điểm lớn hơn cả chuyện vòng lặp không được chiếm CPU quá lâu và mọi tác vụ dài đều phải yield tường minh là: càng mở nhiều app thì tốc độ xử lý của từng app càng chậm. Tôi hiếm khi mở hơn 10 app, nhưng từng mở tới 30 tab; nếu mỗi cái đều là một process thì chắc chắn sẽ thấy tụt hiệu năng rõ rệt. Nếu phần cứng đủ nhanh thì không sao, nhưng với các tác vụ nặng như render video chẳng hạn, có thể cảm nhận khác biệt rất lớn như từ 1 giây thành 30 giây. Dù vậy, chỉ riêng việc hiện thực cả OS theo cách này đã là một thử nghiệm cực kỳ thông minh, ấn tượng và đầy hứng khởi
Ngoài cooperative scheduling, việc phòng thủ trước tấn công Spectre cũng có vẻ khó, và tôi cũng nghi ngờ liệu có đạt được hiệu quả nếu không có bộ nhớ ảo hay không. Ví dụ khi xử lý
memory.growtrong WASM, nếu vướng vào bộ nhớ của app khác thì có thể phát sinh tình huống phảimemmovetoàn bộ; không rõ điều đó có thực sự khả thi không. Dù vậy đây vẫn là một dự án cực kỳ ấn tượngTôi tò mò khi wasm component trở thành hiện thực thì những thử nghiệm kiểu này sẽ thay đổi ra sao. Tôi đánh giá cao thiết kế unikernel, và cũng ấn tượng vì Munal OS có khá nhiều chức năng. Tôi hy vọng wasm sẽ được dùng không chỉ cho một ứng dụng đơn khổng lồ mà còn để host nhiều process nhỏ và các môi trường con. Với wasi preview3, khả năng đồng tồn tại giữa đồng bộ và bất đồng bộ có lẽ sẽ sớm mở ra, và khi đó wasm sẽ có gần như đầy đủ các thành phần của một runtime đa dụng. Điều vẫn đáng tiếc là thực tế bridge host object hiện vẫn quá lệch về phía JS, nhưng tôi muốn thấy lời hứa của wasm component — tiêu chuẩn, nhẹ, sandbox, phối hợp đa ngôn ngữ — được thể hiện trong đời thực như một năng lực runtime thực sự chứ không chỉ là một định dạng phân phối. Có thể tham khảo thêm talk này What is a Component (and Why)
Tôi từng xem talk “The Birth and Death of Javascript” tại Pycon 2014, trong đó có đoạn giới thiệu tương lai triển khai sandbox OS bằng asm.js (tiền thân của wasm hiện nay); ý tưởng đó trông rất giống với cốt lõi thiết kế của dự án này nên tôi tò mò không biết nó có ảnh hưởng gì không liên kết talk
Tôi ngạc nhiên khi thấy OS này còn tích hợp cả trình duyệt web riêng mã nguồn trình duyệt web. Trong video demo cũng có thể thấy nó render Hacker News
Vừa thấy kinh ngạc vừa tự hỏi liệu cấu trúc như vậy có thể là tương lai của OS hay không. Ngay cả readme cũng rất thú vị. Tôi tò mò vì sao lại chọn wasmi thay vì wasmtime. Tôi cũng muốn tự thử OS này trên VM và còn có tham vọng port thư viện GUI của mình sang Munal
Từ thời Xerox PARC, các nỗ lực “bytecode hóa userspace” đã lặp đi lặp lại, và theo tôi những ví dụ thực sự thành công trên thị trường chỉ có IBM i, ChromeOS và Android. Dù vậy dự án này rất ngầu và tôi mong nó thành công
Thiết kế của một client OS như vậy thật đáng kinh ngạc. Tôi nghĩ kiểu cấu trúc này cũng có thể thực dụng ngay trên server. Nếu làm kernel thật nhỏ và chỉ giữ lại một app duy nhất đang chạy thì có thể giảm bớt các ranh giới bảo mật không cần thiết. Ví dụ một key/value store sẽ rất hợp với kiểu cấu trúc này. Điều tôi tò mò là với mô hình IO như vậy thì hiệu năng mạng có tốt không, và khi host WASM có thể áp dụng kỹ thuật đặc biệt nào để giảm các bản sao bộ nhớ không cần thiết hay không