JSLinux - Technical Notes

History

In 2011 I wrote the initial version of JSLinux, the first PC/x86 emulator in Javascript running Linux. I reused parts of another of my emulators (QEMU) for the x86 helpers and the devices.

After some time (2015), I modified it to use the asm.js Javascript subset so that it is faster with the browsers supporting it.

In 2016, after having written TinyEMU, initially a RISC-V emulator, I decided to make a Javascript version from its C code by using emscripten. I added a VirtIO 9P filesystem inspired by the one in jor1k by Sebastian Macke so that it is easier to use remote filesystems and to import or export files.

Then I found interesting to reuse the VirtIO devices for the x86 JS emulator, so I converted the JSLinux asm.js code to C and converted it back to Javascript with emscripten ! With a careful tuning, the new version is now faster than the hand-coded asm.js version.

The next step was to run another operating system than Linux, for example Windows NT. A first release of this emulator ran Windows NT with QEMU inside the emulated Linux system. It was still usable because the x86 emulator supports an x86 virtualization extension (AMD SVM) used by QEMU.

The current version of JSLinux runs Windows NT by emulating the few missing PC devices (PS/2 keyboard and mouse, IDE disk, dummy VGA).

x86 CPU Emulation

Pentium class CPU

x87 with bit exact 80 bit floating point numbers

PAE support

CMOV instructions

MMX and SSE2 support

AMD Virtual Machine extensions (SVM) with Nested Page Table support

RDPMC support to read the instruction count

No segment limit and right checks when accessing memory

No debug support (DRx registers)

Emulated Devices

8259 Programmble Interrupt Controller

8254 Programmble Interrupt Timer

16450 UART (only used to debug)

Real Time Clock

PCI bus

VirtIO console

VirtIO 9P filesystem

VirtIO network

VirtIO block device

VirtIO input

Simple framebuffer

IDE controller (optional)

PS/2 keyboard and mouse (optional)

Dummy VGA display (optional)

RISC-V CPU Emulation

Only the RISC-V 64 bit Buildroot and Fedora distributions are now available. The RISC-V 32 bit images are still available but no longer actively maintained:

buildroot-riscv32 with console.

buildroot-riscv32 with X Window.

Performance

vmtime

Javascript Terminal

Linux distribution

Networking

What's the use ?

Benchmarking of Javascript engines (how much time takes your Javascript engine to boot Linux ?) and use of new browser technologies (asm.js, WASM).

Learning to use command line Unix tools without leaving the browser.

Secure file access within the browser (vfsync).

Running old PC software.

Source code

Similar projects