Holmesian Blog

在Web上运行的Linux系统

神器在这里http://bellard.org/jslinux/

请使用Firefox 4或者Chrome 11打开上面这个页面,那么你会看到一个Linux的启动过程,请注意:这不是什么模拟Linux启动的假游戏,而是确确实实通过JS编写的模拟器启动了一个确实存在的Linux系统!

该操作系统由Fabrice Bellard大牛完成,这个神奇的东西引起了包括Javascript的创建者Brendan Eich在内N多人的注意。随后,Fabrice Bellard大牛发布了相关的技术说明:http://bellard.org/jslinux/tech.html,从这份文档中可以知道:

这个模似器完全由Javascript写成,CPU仿真器使用的是QEMU,Linux 使用了2.6.20内核,磁盘用的是Ram Disk,在启动的时候装载。其文件系统由Buildroot 和BusyBox产生。

Web的时代……

Javascript PC Emulator - Technical Notes

By Fabrice Bellard - May 14, 2011

This PC emulator is written in Javascript. The emulated hardware consists in the following devices:

CPU Emulation

Some of the code is inspired from my x86 dynamic translator present in QEMU, but there are important differences because here it is an interpreter. The CPU is close to a 486 compatible x86 without FPU. The lack of FPU is not a problem when running Linux as Operating System because it contains a FPU emulator. In order to be able to run Linux, a complete MMU is implemented. The exact restrictions of the emulated CPU are:

  1. No FPU/MMX/SSE
  2. No segment limit and right checks when accessing memory (Linux does not rely on them for memory protection, so it is not an issue. The x86 emulator of QEMU has the same restriction).
  3. No CS/DS/ES/SS segment overrides. FS/GS overrides are implemented because they are needed for Thread Local Storage in Linux.
  4. A few seldom used instructions are missing (BCD operations, BOUND, ...).
  5. No single-stepping
  6. No real mode
  7. No 16 bit protected mode (although most 16 bit instructions are present because they are needed to run 32 bit programs).
    Most of these restrictions are easy to remove, but I decided to implement the strict minimum to be able to use a recent Linux kernel and its user applications.

I added some tricks which are not present in QEMU to be more precise when emulating unaligned load/stores at page boundaries. The condition code emulation is also more efficient than the one in QEMU.

Devices

Currently there is no synchronization between the PIT frequency and the real time, so there is a variable drift between the time returned by Linux (try the "date" command) and the real time.

The UART (serial port) does not support FIFO mode. Perhaps it could help to improve the display speed.

There is no network emulation at this point.

A clipboard device (seen as /dev/clipboard in the emulator) was added to allow exchange of data between the emulator and the outside world.

Javascript terminal

Although I could have reused the excellent termlib, I decided to write my own because I was curious to see how it could be done. The main problem is the key handling which is different among browsers and OSes, as described here.

Linux distribution

I compiled a 2.6.20 Linux kernel (I guess any other version would work provided there is still an FPU emulator). The configuration is here and there is a small optional patchto avoid outputting warnings due to the slow serial port. An uncompressed kernel image is used instead of a compressed one to have a faster boot. It is generated with "objcopy -O binary vmlinux vmlinux.bin".

The disk image is just a ram disk image loaded at boot time. It contains a filesystem generated with Buildroot containing BusyBox. I added my toy C compiler TinyCC and my unfinished but usable emacs clone QEmacs.

Javascript

I happen to be interested by the implementation of Javascript engines these days - but I don't know yet if I will write my own any time soon ! Anyway, this emulator was a way to learn how to write optimized code for recent Javascript engines, in particular Jaeger Monkey (for Firefox 4) and V8 (for Chrome).

A troubling thing is that the PC emulator is about 2 times slower using V8 than Jaeger Monkey (I used the 32 bit version for both). I have no precise explanation yet because I only looked at the Jeager Monkey code so far.

What's the use ?

I did it for fun, just because newer Javascript Engines are fast enough to do complicated things. Real use could be:

[Back to the PC emulator]

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »