Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Так оно и есть.

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

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

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

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

Заключение: впечатляет. Не могу дождаться появления эмулятора C64: -)

Ответ 2

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

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

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

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