JSLinux rewritten to be human readable, hand deobfuscated and annotated.
JavaScript Other
Latest commit d4d5124 Nov 7, 2015 @levskaya Merge pull request #12 from staeff/patch-1
Fix broken link
Permalink
Failed to load latest commit information.
refactoring_hacks autocommented the weird operation-size-counting function Dec 24, 2011
CMOS.js Added comments and clarification on the PIC and PIT emulation code. Sep 16, 2013
KBD.js Clarified licensing information subject to the received permission of… Mar 29, 2013
LICENSE Clarified licensing information subject to the received permission of… Mar 29, 2013
PCEmulator.js Works on modern browsers again by fixing XHR loading of binaries to b… Oct 19, 2014
PIC.js Added comments and clarification on the PIC and PIT emulation code. Sep 16, 2013
PIT.js Added comments and clarification on the PIC and PIT emulation code. Sep 16, 2013
Serial.js Clarified licensing information subject to the received permission of… Mar 29, 2013
clipboard.js Clarified licensing information subject to the received permission of… Mar 29, 2013
cpux86-ta.js Works on modern browsers again by fixing XHR loading of binaries to b… Oct 19, 2014
cpux86-ta.original.js added the actual original cpu code for reference Dec 21, 2011
index.html Works on modern browsers again by fixing XHR loading of binaries to b… Oct 19, 2014
jslinux.js Works on modern browsers again by fixing XHR loading of binaries to b… Oct 19, 2014
linuxstart-20110820.tar.gz more notes Dec 17, 2011
linuxstart.bin moved files Dec 17, 2011
readme.md Fix broken link Nov 7, 2015
root.bin moved files Dec 17, 2011
term.js finished naming functions insofar as I can without overspeculating on… Dec 25, 2011
vmlinux-2.6.20.bin moved files Dec 17, 2011

readme.md

De-obfuscated JSLinux

I wanted to understand how the amazing JsLinux worked, so in a fit of mania I hand de-obfuscated the codebase while studying it over a few days' time. In the off-chance someone else might be interested in this code as a basis for further weird in-browser x86 hacking I posted this redacted version of the code here, with permission of Mr. Bellard.

I highly recommend checking out another open-source x86 emulation project that includes vga support, "v86" (demo / source). There's yet another open-source 386-style emulator in javascript called jslm32.

For a simpler RISC architecture, take a look at the linux on jor1k emulator project.

Finally, the Angel emulator (source) shows off the elegant open-ISA 64bit RISC-V architecture that is being brought to silicon by the lowrisc team. This is by far the cleanest architecture for studying general low-level hardware and operating system implementation details.

Status

The current codebase should run on most modern versions of Chrome, Safari, and Firefox. If you're running it locally, you will need to load it via a local server to allow the XHR requests to load the binaries.

jslinux-deobfuscated is still a dense, messy code base from any pedagogic point of view. However for those interested in Mr. Bellard's code, this version is nowhere near so incomprehensible as the original. Nearly all of the global variables and function names have been named somewhat sensibly. Many pointers to references have been added to the source.

The core opcode execution loop has been commented to indicate what instruction the opcode refers to.

Unresolved

One mystery is, why does CPUID(1) return 8 << 8 in EBX? EBX[15:8] is now used to indicate CLFLUSH line size, but that field must have been used for something else in the past.

The CALL/RET/INT/IRET routines are still quite confused and haven't yet been rewritten. The code dealing with segmentation, and some of the code for real-mode remains relatively messy.

Any recommendations / clarifications are welcome!

ETC

I highly recommend, by the way, the excellent JSShaper library for transforming large javascript code bases. The hacks I made from it are in this repo: a little symbol-name-transformer node.js script and an emacs function for doing this in live buffers.

License

This is a pedagogical/aesthetic derivative of the original JSLinux code Copyright (c) 2011-2014 Fabrice Bellard. It is posted here with permission of the original author subject to his original constraints : Redistribution or commercial use is prohibited without the (original) author's permission.

References

Some other helpful references for understanding what's going on:

x86

Bit Hacking

Other devices