Fabrice Bellard的Javascript Linux模拟器是如何工作的?

71

今天我有一个惊人的时刻,当我看到JavaScript中的Linux模拟器:

http://bellard.org/jslinux/

它可以编译C程序,具备vi和emacs编辑器,支持所有shell命令等等。

它是如何工作的?


9
太棒了。你有注意到'technical details'这个链接吗? - sehe
13
看着Fabrice Bellard的成就,对于任何一位程序员来说都是一次非常令人敬畏的经历。 - Julian Go
有人在读 /. 我猜 :p。 - wimvds
2个回答

37

起初,我也认为这只是一个连接到虚拟机的终端模拟器,但实际上不是这样的。如果你观察网络连接,可以看到,在启动后,就不再传输数据了。

所以这是真实的。

CPU并不神奇;实际上它所做的就是从内存读取字节,并根据指令修改RAM。

在这种情况下,CPU模拟器基于qemu代码。他所做的是创建一个函数数组,其中索引是PC(程序计数器)的下一个字节。

现在,你只需要一个简单的Linux发行版,它不需要任何异乎寻常的CPU指令,如浮点运算或MMX代码,就可以轻松搞定了。

有趣的是这个东西的速度。整个过程有点缓慢,但毕竟是在浏览器中执行JavaScript。

结论:令人印象深刻。迫不及待地想看到C64模拟器 :-)


有没有一种可以模拟SID和VIC芯片的方法? - Aaron Digulla

32

请参见http://www.quora.com/CPU-Emulation/How-does-bellard-org-jslinux-work

简明解释

jslinux本质上是一个完整的计算机软件实现,特别是JavaScript。当然,这被称为仿真器。这个特定版本的设置是用于运行Linux,但理论上也可以运行其他操作系统。

该仿真器(JavaScript,约90KB缩小,约7000行格式化)被加载到浏览器中。先前编译为x86处理器的机器代码的Linux版本被加载并复制到一个整数数组中,该数组充当了仿真计算机的RAM。然后将仿真器CPU指向机器代码的第一条指令,并告诉其开始解释指令(例如读取/写入RAM,执行算术和逻辑操作,跳转到不同的指令等)。有时,它将通过另一个模拟串口和使用浏览器DOM的终端的JavaScript代码将数据(如系统日志或shell命令提示符)写入“终端”。通过此模拟串口,您的按键也会发送回Linux...


48
哦,Quora社区实际上提供了比SO更好的答案。 - Nikita Barsukov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接