Developpez.com

Le Club des Développeurs et IT Pro

Le noyau Linux débarque sur les navigateurs Web

Grâce à un émulateur en JavaScript, un exploit signé Fabrice Bellard

Le 2011-05-18 12:51:19, par Idelways, Expert éminent sénior
Nombreux sont nos lecteurs à s’être interrogés récemment sur l'utilité conceptuelle de l'ajout de capacités de Peer-2-Peer aux navigateurs, entrepris par le W3C ; mais que penseraient-ils d'y voir tourner le noyau Linux ?

C'est l'exploit inouï revendiqué par Fabrice Bellard et réalisé d'après lui uniquement « pour le fun » grâce aux nouveaux moteurs JavaScript « assez rapides pour permettre de faire des choses compliquées »

Bellard, cet informaticien et mathématicien français de renommée vient en effet de publier sur son site un émulateur PC, entièrement écrit en JavaScript qui permet de lancer un noyau Linux minimaliste (avec un terminal) directement dans le navigateur.

Un tour de force qui fait réagir les grosses pointures du langage JavaScript, y compris son inventeur et membre de la fondation Mozilla Brendan Eich qui se réjouit de voir cet émulateur fonctionner « deux fois plus vite » sur JaegerMonkey que sur le moteur V8 de Google.

Quoi qu'il en soit, le résultat fonctionne sous Google Chrome 11 et Firefox 4 au rythme d'un ordinateur sorti tout droit des années 90 avec un vénérable processeur 486 de chez Intel.



L'émulateur ne dispose toutefois pas d'une unité de calcul des nombres à virgule flottante, un manque heureusement émulé par la version du noyau Linux utilisée (2.6.20), sortie en 2007.

Cet exploit rappelle en tout cas que Google n'est pas le seul à en demander plus aux navigateurs, qui quittent progressivement le statut d'applications au sens classique du terme.

Source : site de Fabrice Bellard, compte twitter de Brendan Eich

Et vous ?

Que pensez-vous de cet exploit ?
  Discussion forum
56 commentaires
  • Firwen
    Membre expérimenté
    En fait, il a coder un emulateur x86 suffisamment complet pour exécuter du code natif x86 sur un environnement javascript .

    Some of the code is inspired from my x86 dynamic translator present in QEMU, but there are important differences because here it is an interpreter. The CPU is close to a 486 compatible x86 without FPU. The lack of FPU is not a problem when running Linux as Operating System because it contains a FPU emulator. In order to be able to run Linux, a complete MMU is implemented. The exact restrictions of the emulated CPU are:

    No FPU/MMX/SSE
    No segment limit and right checks when accessing memory (Linux does not rely on them for memory protection, so it is not an issue. The x86 emulator of QEMU has the same restriction).
    No CS/DS/ES/SS segment overrides. FS/GS overrides are implemented because they are needed for Thread Local Storage in Linux.
    A few seldom used instructions are missing (BCD operations, BOUND, ...).
    No single-stepping
    No real mode
    No 16 bit protected mode (although most 16 bit instructions are present because they are needed to run 32 bit programs).

    Most of these restrictions are easy to remove, but I decided to implement the strict minimum to be able to use a recent Linux kernel and its user applications.
    Ce type débarque d'une autre planète.
  • Elepole
    Membre éprouvé
    Envoyé par TNT89


    rm -rf / puis F5 puis rm -rf / puis F5 puis...
    Rien que pour sa c’est l'invention du siècle.
  • lennelei
    Membre chevronné
    cf mon précédent message

    il y a 2 scripts javascripts : le premier simule le terminal (term.js), le second émule totalement un processeur (cpux86.js dans le même genre que qemu)

    si tu regardes le second script, tu as tout à la fin une fonction start() :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function start() {
        var Hf, i, start, If, Jf;
    ...
        ya.load_binary("vmlinux26.bin", 0x00100000);
        Jf = ya.load_binary("root.bin", 0x00400000);
        start = 0x10000;
        ya.load_binary("linuxstart.bin", start);
    ...
    }
    C'est cette fonction start qui charge d'une part, le noyau vmlinux26.bin qui a été compilé à part, et d'autre part, le filesystem contenu dans root.bin (et aussi un autre truc linuxstart.bin que je ne sais pas à quoi il sert visiblement, "démarrer" le système).

    Tu peux d'ailleurs télécharger ces 3 fichiers (et également les 2 javascript) et mettre tout ça chez toi et ça marchera pareil (je l'ai d'ailleurs fait).

    Ensuite, j'avoue que je suis absolument incapable de comprendre comment ça va plus loin j'imagine que le script construit un objet qui va être ta machine virtuelle et que, d'une manière ou d'une autre, ce petit code de 7000 lignes à peine arrive à interpréter le noyau qui va à son tour amorcer linux et le filesystem... mais franchement, pour moi, c'est de la magie noire

    si tu télécharges ce filesystem sur un linux, tu peux parfaitement le monter et le modifier :
    Code :
    1
    2
    3
    4
    $ sudo mount root.bin /mnt/jslinux/
    Password:
    $ ls /mnt/jslinux/
    bin  dev  etc  lib  linuxrc  lost+found  mnt  proc  root  sbin  tmp  usr

    Edit :

    Envoyé par Golgotha
    - les fichier du system sont ou ? << dans l'image root.bin
    - les fichier créer sont ou ? << dans la mémoire de ton PC : ils sont perdus si tu fermes la fenêtre
    - C'est écrit en javascript, mais quel partie ? << le terminal et l'émulateur du processeur
    - comment du javascript peut elle lancer une distrib linux ? << parce que le javascript émule une machine, et que du coup, comme tout émulateur, c'est capable de lancer du code machine
  • gokudomatic
    Membre régulier
    j'y vois un grand intérêt pédagogique pour une première intro à linux.
  • TNT89
    Membre confirmé


    Tout simplement E-N-O-R-M-E!

    Personnellement, je le trouve très réactif : 4 secondes de "boot" et après ça tourne nickel...

    rm -rf / puis F5 puis rm -rf / puis F5 puis...
  • Golgotha
    Membre expert
    j'arrive pas à quitter vi
  • lennelei
    Membre chevronné
    Petite précision : le javascript ne sert qu'à émuler le processeur et le terminal.

    Le noyau chargé est compilé, et le filesystem est un fichier image qui peut être monté sur n'importe quel Linux (et donc modifié par qui le souhaite )

    Donc potentiellement, n'importe qui peut recompiler un autre noyau, ou modifier le contenu du fichier root.bin pour y ajouter des trucs !
  • ProgVal
    Membre éclairé
    Notons également que l'auteur de JSLinux est aussi celui de QEmu
  • thelvin
    Modérateur
    Il y avait déjà des Box DOS en ligne, permettant de jouer à de vieux jeux.
    Jusqu'à maintenant elles tournaient en Flash, je suppose que bientôt ça marchera même sans Flash.

    (Jeu : réaliser cela en installant DOSBox sous linux tournant sur un x86 émulé par JavaScript. Une fois que c'est fait, Faire tourner un navigateur dedans. Et pousser ce navigateur à appeler la même page.)
  • nu_tango
    Membre averti
    Là je suis vraiment sur le c** si vous me permettez l'expression.

    Code :
    1
    2
    3
    4
    5
    6
    / # cat /proc/cpuinfo                                                            
    processor       : 0                                                             
    vendor_id       : GenuineIntel                                                  
    cpu family      : 5                                                             
    model           : 4                                                             
    model name      : Pentium MMX
    Je dis chapeau M. Fabrice Bellard