Wie funktioniert der Linux-Emulator in Javascript von Fabrice Bellard?

69

Heute hatte ich einen atemberaubenden Moment, als ich den Linux-Emulator in Javascript sah: http://bellard.org/jslinux/

Es kompiliert C-Programme, hat vi und emacs, unterstützt alle Shell-Befehle usw. usw.

Wie funktioniert es?

Nikita Barsukov
quelle
9
Das ist ziemlich großartig. Sie haben den Link "Technische Details" notiert , oder?
sehe
13
Die Errungenschaften von Fabrice Bellard zu betrachten, ist für jeden Programmierer eine sehr demütigende Erfahrung.
Julian Go
Jemand hat gelesen /. Ich denke: p.
Wimvds

Antworten:

36

Zuerst dachte ich auch, dass dies nur ein Terminalemulator ist, der Sie mit einer VM verbindet, aber das ist es nicht. Wenn Sie die Netzwerkverbindungen beobachten, können Sie feststellen, dass nach dem Start keine Daten mehr übertragen werden.

Also ist es echt.

Eine CPU ist nichts Magisches; Tatsächlich liest es nur Bytes aus dem Speicher und ändert den RAM entsprechend der Bedeutung der Befehle.

In diesem Fall basiert der CPU-Emulator auf dem QEMU-Code. Er erstellt eine Reihe von Funktionen, bei denen der Index das nächste Byte am PC ist (Programmzähler).

Jetzt brauchen Sie nur noch eine einfache Linux-Distribution, die keine exotischen CPU-Befehle wie Gleitkomma-Arithmetik oder MMX-Code und Voila benötigt.

Interessant ist die Geschwindigkeit des Tieres. Das Ganze ist etwas träge, aber dann ist es JavaScript in einem Browser.

Fazit: Beeindruckend. Ich kann es kaum erwarten, einen C64-Emulator zu sehen :-)

Aaron Digulla
quelle
Gibt es eine, die die SID- und VIC-Chips emulieren kann?
Aaron Digulla
29

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

Vereinfachte Erklärung

jslinux ist im Wesentlichen ein vollständiger Computer, der in Software implementiert ist, insbesondere JavaScript. Dies ist natürlich als Emulator bekannt. Diese spezielle Version ist für die Ausführung von Linux eingerichtet, könnte aber theoretisch stattdessen andere Betriebssysteme ausführen.

Der Emulator (JavaScript, ~ 90 KB minimiert, ~ 7000 Zeilen formatiert) wird in den Browser geladen. Eine Linux-Version wurde zuvor in Maschinencode kompiliert, damit ein x86-Prozessor geladen und in eine große Anzahl von Ganzzahlen kopiert wird, die als RAM des emulierten Computers fungieren. Die Emulator-CPU wird dann auf die erste Anweisung des Maschinencodes hingewiesen und angewiesen, mit der Interpretation der Anweisungen zu beginnen (z. B. Lesen / Schreiben von RAM, Ausführen von arithmetischen und logischen Operationen, Herumspringen zu verschiedenen Anweisungen usw.). Manchmal werden Daten (wie das Systemprotokoll oder eine Shell-Eingabeaufforderung) über einen anderen JavaScript-Code, der eine serielle Schnittstelle und ein Terminal mithilfe des Browser-DOM simuliert, in das "Terminal" geschrieben. Ihre Tastendrücke werden auch über diese simulierte serielle Schnittstelle an Linux zurückgesendet ...

Alex
quelle
42
Oh, die Quora-Community hat tatsächlich eine bessere Antwort als SO geliefert.
Nikita Barsukov