web-dev-qa-db-fra.com

Comment fonctionne l'émulateur Linux en Javascript de Fabrice Bellard?

Aujourd'hui, j'ai eu un moment de mâchoire, quand j'ai vu l'émulateur Linux en Javascript: http://bellard.org/jslinux/

Il compile les programmes C, il a vi et emacs, il prend en charge toutes les commandes Shell, etc.

Comment ça marche?

68
Nikita Barsukov

Au début, je pensais aussi que ce n'était qu'un émulateur de terminal vous connectant à un VM mais ce n'est pas le cas. Si vous regardez les connexions réseau, vous pouvez voir qu'après le démarrage, aucune donnée n'est transmis plus.

C'est donc réel.

Un CPU n'est pas quelque chose de magique; en fait, il ne fait que lire les octets de la mémoire et modifier le RAM selon la signification des commandes).

Dans ce cas, l'émulateur CPU est basé sur le code qemu. Ce qu'il fait, c'est qu'il crée un tableau de fonctions où l'index est l'octet suivant sur le PC (compteur de programmes).

Maintenant, tout ce dont vous avez besoin est une distribution linux simple qui ne nécessite aucune commande CPU exotique comme l'arithmétique à virgule flottante ou le code MMX et le tour est joué.

Ce qui est intéressant, c'est la vitesse de la bête. Le tout est un peu lent, mais ensuite, c'est JavaScript dans un navigateur.

Conclusion: impressionnant. J'ai hâte de voir un émulateur C64 :-)

36
Aaron Digulla

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

Explication simplifiée

jslinux est essentiellement un ordinateur complet implémenté dans un logiciel, spécifiquement JavaScript. Il s'agit bien sûr d'un émulateur. Cette version particulière est configurée pour exécuter Linux, mais en théorie, elle pourrait exécuter d'autres systèmes d'exploitation à la place.

L'émulateur (JavaScript, ~ 90 Ko réduit, ~ 7 000 lignes formatées) est chargé dans le navigateur. Une version de Linux a été précédemment compilée en code machine pour un processeur x86 est chargé et copié dans un grand tableau d'entiers qui agit comme RAM de l'ordinateur émulé. L'UC de l'émulateur est ensuite pointé vers la première instruction du code machine et doit commencer à interpréter les instructions (comme lire/écrire de la RAM, effectuer des opérations arithmétiques et logiques, passer à différentes instructions, etc.). Parfois, il écrit des données (comme le journal système ou une invite de commande Shell) sur le "terminal" via un autre morceau de code JavaScript qui simule un port série et un terminal utilisant le navigateur DOM. Vos pressions sur les touches sont également renvoyées à Linux via ce port série simulé ...

24
alex