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


69

今天,当我看到用Javascript编写的Linux模拟器时,我感到非常震惊:http : //bellard.org/jslinux/

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

它是如何工作的?


9
太棒了 您确实注意到了“技术细节”链接,对吗?
sehe 2011年

13
对任何程序员来说,看Fabrice Bellard的成就都是非常卑鄙的经历。
朱利安·高(Julian Go),

有人在读/。我猜:p。
wimvds 2011年

Answers:


36

起初,我还认为这只是将您连接到VM的终端仿真器,但事实并非如此。如果您看到网络连接,则可以看到启动后不再传输任何数据。

这是真实的。

CPU并不是魔术。实际上,它所做的只是从内存中读取字节并根据命令的含义修改RAM。

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

现在,您只需要一个简单的linux发行版,就不需要任何特殊的CPU命令,例如浮点算术或MMX代码和voila。

有趣的是野兽的速度。整个过程有点迟钝,但是然后是浏览器中的JavaScript。

结论:令人印象深刻。等不及要看C64模拟器了:-)


有一种可以模拟SID和VIC芯片吗?
亚伦·迪古拉

29

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

简化说明

jslinux本质上是用软件(尤其是JavaScript)实现的完整计算机。这当然称为模拟器。该特定版本设置为运行Linux,但理论上它可以运行其他操作系统。

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


42
哦,Quora社区实际上产生了一个更好的答案。
Nikita Barsukov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.