72 Stimmen

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

Heute fiel mir die Kinnlade runter, als ich einen Linux-Emulator in Javascript sah: http://bellard.org/jslinux/

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

Wie funktioniert das?

38voto

Aaron Digulla Punkte 308693

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 sehen, dass nach dem Hochfahren keine Daten mehr übertragen werden.

Es ist also echt.

Eine CPU ist nichts Magisches; sie liest lediglich Bytes aus dem Speicher und verändert den Arbeitsspeicher entsprechend der Bedeutung der Befehle.

In diesem Fall basiert der CPU-Emulator auf dem qemu-Code. Er erstellt ein Array von Funktionen, wobei der Index das nächste Byte am PC (Programmzähler) ist.

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

Interessant ist die Geschwindigkeit des Tieres. Das Ganze ist ein bisschen träge, aber es ist ja auch JavaScript in einem Browser.

Schlussfolgerung: Beeindruckend. Kann es kaum erwarten, einen C64-Emulator zu sehen :-)

33voto

alex Punkte 1594

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

Vereinfachte Erläuterung

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

Der Emulator (JavaScript, ~90KB minified, ~7000 Zeilen formatiert) wird in den Browser geladen. Eine Version von Linux, die zuvor in Maschinencode für einen x86-Prozessor kompiliert wurde, wird geladen und in ein großes Array von Ganzzahlen kopiert, das als RAM des emulierten Computers fungiert. Die CPU des Emulators wird dann auf die erste Anweisung des Maschinencodes verwiesen und angewiesen, mit der Interpretation der Anweisungen zu beginnen (z. B. Lesen/Schreiben von RAM, Durchführung arithmetischer und logischer Operationen, Springen zu anderen Anweisungen usw.). Manchmal werden Daten (z. B. das Systemprotokoll oder eine Shell-Eingabeaufforderung) über einen anderen JavaScript-Code, der eine serielle Schnittstelle und ein Terminal mit Hilfe des Browser-DOM simuliert, in das "Terminal" geschrieben. Ihre Tastendrücke werden auch über diese simulierte serielle Schnittstelle an Linux zurückgeschickt...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X