Как работает эмулятор Linux в Javascript от Fabrice Bellard?


сегодня у меня был момент падения челюсти, когда я увидел эмулятор Linux в Javascript: http://bellard.org/jslinux/

он компилирует программы C, он имеет vi и emacs, он поддерживает все команды оболочки и т. д.

Как это работает?

2 67

2 ответа:

сначала я также думал, что это просто эмулятор терминала, соединяющий вас с виртуальной машиной, но это не так. Если вы смотрите сетевые подключения, вы можете видеть, что после загрузки данные больше не передаются.

Так это реально.

процессор не является чем-то волшебным; на самом деле все, что он делает, это считывает байты из памяти и изменяет ОЗУ в соответствии с тем, что означают команды.

в этом случае эмулятор ЦП основан на коде qemu. Что он делает, он создает массив функций, где индекс является следующим байтом на ПК (счетчик программ).

теперь все, что вам нужно, это простой дистрибутив linux, который не требует каких-либо экзотических команд процессора, таких как арифметика с плавающей запятой или код MMX и вуаля.

Что интересно, так это скорость зверя. Все это немного вяло, но тогда, это JavaScript в браузере.

Вывод: Впечатляет. Не могу дождаться, чтобы увидеть эмулятор C64 : -)

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

Упрощенное Объяснение

jslinux-это по существу полный компьютер, реализованный в программном обеспечении, в частности JavaScript. Это, конечно, известно как эмулятор. Данная версия настроена для запуска Linux, но в теории она может запускать другие операционные системы.

эмулятор (JavaScript, ~ 90KB minified, ~7000 строк в формате) загружается в браузер. Версия Linux, ранее скомпилированная в машинный код для процессора x86, загружается и копируется в большой массив целых чисел, который действует как ОЗУ эмулируемого компьютера. Затем процессор эмулятора указывает на первую инструкцию машинного кода и говорит, чтобы начать интерпретировать инструкции (например, чтение/запись ОЗУ, выполнение арифметических и логических операций, переход к различным инструкциям и т. д.). Иногда он будет записывать данные (например, системный журнал, или командная строка оболочки) к" терминалу " через другой фрагмент кода JavaScript, который имитирует последовательный порт и терминал с помощью браузера DOM. Ваши нажатия клавиш также отправляются обратно в Linux через этот симулированный последовательный порт...