- Trình giả lập PC dựa trên JavaScript/WASM có thể chạy Linux và Windows NT ngay trong trình duyệt; đây là dự án do Fabrice Bellard khởi đầu từ năm 2011 với tư cách trình giả lập x86 JS đầu tiên và tiếp tục phát triển cho tới nay
- Biên dịch mã C dựa trên TinyEMU bằng emscripten, đồng thời sử dụng thiết bị VirtIO để hỗ trợ hệ thống tệp, mạng và thiết bị khối
- Giả lập CPU x86 64-bit có độ hoàn thiện cao, bao gồm cả các tập lệnh mở rộng mới nhất như AVX-512, APX
- Cũng hỗ trợ giả lập CPU RISC-V 32/64-bit, có thể chạy nhiều bản phân phối như Alpine Linux, Buildroot
- Có các trường hợp sử dụng thực tiễn như benchmark hiệu năng JavaScript engine, học Unix trong trình duyệt và chạy phần mềm PC cũ
Lịch sử
- Phiên bản đầu tiên năm 2011 là trình giả lập PC/x86 đầu tiên được viết bằng JavaScript, tái sử dụng mã helper x86 và mã thiết bị của QEMU
- Năm 2015, áp dụng tập con asm.js để cải thiện tốc độ trên các trình duyệt hỗ trợ
- Năm 2016, sau khi viết TinyEMU là trình giả lập RISC-V, tác giả chuyển mã C sang JavaScript bằng emscripten
- Bổ sung hệ thống tệp VirtIO 9P lấy cảm hứng từ jor1k (Sebastian Macke), giúp truy cập hệ thống tệp từ xa và import/export tệp dễ dàng
- Để tái sử dụng thiết bị VirtIO cho cả trình giả lập x86 JS, dự án đã trải qua quá trình chuyển mã asm.js của JSLinux sang C rồi lại chuyển ngược sang JavaScript bằng emscripten
- Nhờ tinh chỉnh chi tiết, đạt hiệu năng còn nhanh hơn bản asm.js viết thủ công
- Để chạy Windows NT, ban đầu dùng cách chạy lồng QEMU bên trong Linux được giả lập
- Vì trình giả lập x86 hỗ trợ mở rộng ảo hóa AMD SVM, nên ngay cả khi chạy lồng vẫn đạt mức có thể sử dụng được
- Phiên bản hiện tại tự giả lập các thiết bị PC còn thiếu như bàn phím/chuột PS/2, đĩa IDE, VGA giả để chạy Windows NT theo cách native
Giả lập CPU x86
- Giả lập CPU x86 với các tính năng sau:
- CPU lớp Pentium
- x87 dấu phẩy động 80-bit (bit exact)
- PAE
- Các lệnh CMOV
- Hỗ trợ MMX, SSE2
- Mở rộng máy ảo AMD SVM (hỗ trợ Nested Page Table)
- Đọc số lượng lệnh thông qua RDPMC
- Các hạn chế đã biết:
- Khi truy cập bộ nhớ, không thực hiện kiểm tra giới hạn phân đoạn và quyền truy cập
- Không hỗ trợ debug (thanh ghi DRx)
Thiết bị được giả lập
- 8259 PIC (Programmable Interrupt Controller)
- 8254 PIT (Programmable Interrupt Timer)
- 16450 UART (chỉ dùng cho debug)
- Đồng hồ thời gian thực
- PCI bus
- VirtIO console, hệ thống tệp 9P, mạng, thiết bị khối, input
- Simple framebuffer
- Bộ điều khiển IDE, bàn phím/chuột PS/2, màn hình VGA giả (mỗi thành phần đều là tùy chọn)
Giả lập CPU RISC-V
- Giả lập CPU RISC-V 32-bit hoặc 64-bit, hỗ trợ FPU 64-bit và compressed instructions
- Hiện cung cấp các bản phân phối Buildroot và Fedora cho RISC-V 64-bit
- Ảnh RISC-V 32-bit vẫn còn dùng được nhưng không còn được bảo trì tích cực
- Cung cấp bản console buildroot-riscv32 và bản X Window
Hiệu năng
- Tính đến năm 2017, trên PC desktop phổ thông khi dùng Firefox, trình giả lập x86 chạy ở khoảng 100 MIPS
- Có thể thực hiện benchmark chi tiết bằng tiện ích
vmtime tích hợp
Terminal JavaScript
- Là phiên bản cải tiến của terminal JSLinux gốc, hỗ trợ thanh cuộn và highlight URL
Bản phân phối Linux
- Sử dụng các bản phân phối Alpine Linux và Buildroot
- Bổ sung các gói tùy biến như vfsync, qemacs, tcc
- Hỗ trợ X Window tùy chọn thông qua window manager Fluxbox
Mạng
- Có thể truy cập Internet từ bên trong trình giả lập
- Sử dụng websocket VPN do Benjamin Burns cung cấp
- Giới hạn băng thông 40 kB/s, cho phép tối đa 2 kết nối cho mỗi IP công cộng
Mục đích sử dụng
- Benchmark JavaScript engine (ví dụ: đo thời gian khởi động Linux) và tận dụng các công nghệ trình duyệt mới như asm.js, WASM
- Học các công cụ Unix dòng lệnh mà không cần rời khỏi trình duyệt
- Truy cập tệp an toàn trong trình duyệt (vfsync)
- Chạy phần mềm PC legacy
Mã nguồn và các dự án tương tự
- Mã nguồn phiên bản RISC-V được cung cấp trong dự án TinyEMU, đồng thời cũng có demo dựng sẵn dễ cài đặt
- Các dự án tương tự:
- jor1k: trình giả lập CPU OpenRISC OR1K
- v86: trình giả lập PC
- angel: trình giả lập CPU RISC-V
1 bình luận
Có vẻ như cấu hình CORS bị sai, nên phải vào https://bellard.org/jslinux/ thay vì https://www.bellard.org/jslinux/ trong liên kết thì mới hoạt động bình thường.