Journal Linux dans votre navigateur web

56
17
mai
2011

Après, entre autre, Qemu, Ffmpeg, Tcc et après avoir calculé le plus grand nombre de décimales de Pi, Fabrice Bellard nous livre cette fois-ci, un émulateur x86 tournant dans un navigateur web. Pour tester, il vous faudra utiliser soit FF4 soit Chromium. (A noter: l'exécution dans FF est environ 2 fois plus rapide.)

L'image disque est un ramfs qui contient un système de fichiers créé avec buildroot contenant busybox. Le noyau est un 2.6.20. Pour l'instant, il n'y a pas d'émulation réseau. Par contre le compilateur tcc est disponible ainsi que emacs (et vi). Il y a d'ailleurs un fichier hello.c que l'on peut compiler.

Il y a plus d'info disponible ici.

Comme vu dans un commentaire sur un autre site, il ne manque plus qu'à faire tourner X et on pourra alors faire tourner FF qui tourne sur un Linux qui tourne sur FF qui tourne sur Linux qui...

  • # liens pas bons

    Posté par . Évalué à 8.

    http://www.ffmpeg.org/ pour ffmpeg
    http://bellard.org/tcc/ avec un d et non un g
    http://bellard.org/jslinux/tech.html pareil pour le dernier ...

    • [^] # Re: liens pas bons

      Posté par . Évalué à 2.

      Arg, désolé, si un modo pouvait corriger cela, je lui serais bien reconnaissant. D'ailleurs je ne comprends pas pourquoi j'ai mis un 'g' dans les liens alors que j'ai écris son nom correctement. :\

      Merci pour avoir relevé ces erreurs et, promis, la prochaine fois je vérifierai que les urls soient correctes.

  • # Explication

    Posté par . Évalué à 0.

    Pour une raison inconnue, je n'arrive pas à acceder à bellarg.org

    Quelqu'un pourrait m'expliquer le fonctionnement
    c'est une applet/du code js qui tourne sur le navigateur ? L'affichage d'une machine distante ?

    • [^] # Re: Explication

      Posté par . Évalué à 2.

      Oubliez, le commentaire au dessus corrige le problème

    • [^] # Re: Explication

      Posté par . Évalué à 3.

      c'est une applet/du code js qui tourne sur le navigateur ? L'affichage d'une machine distante ?

      C'est du code Javascript qui s'exécute dans ton navigateur.
      Ce code interprète les opcodes x86.
      Les opcodes x86 qui sont passés à l'interpréteur sont le code d'un noyau Linux et d'un système minimal.

      Bref, Qemu In Da Browser ! :-)

    • [^] # Re: Explication

      Posté par . Évalué à -1.

      Pour une raison inconnue, je n'arrive pas à acceder à bellarg.org

      /.ed

  • # Pas libre

    Posté par (page perso) . Évalué à 10.

    Le code n'est pas libre (peut pas distribuer).

  • # et avec le réseau ...

    Posté par (page perso) . Évalué à 6.

    Comme vu dans un commentaire sur un autre site, il ne manque plus qu'à faire tourner X
    et on pourra alors faire tourner FF qui tourne sur un Linux qui tourne sur FF qui
    tourne sur Linux qui...

    Ou alors avec du réseau il n'y a plus qu'a y lancer un apache pour heberger la bete

  • # Pour moi c'est un peu magique ...

    Posté par . Évalué à 2.

    Est-ce qu'il s'agit d'un émulateur complet (on peux y faire tourner d'autre OS) ?

    Dommage que le code ne soit pas libre ...

    • [^] # Re: Pour moi c'est un peu magique ...

      Posté par (page perso) . Évalué à 5.

      Voir http://bellard.org/jslinux/tech.html

      Il y a le strict minimum pour faire fonctionner Linux, mais ce n'est pas un "PC" complet:

      • Un CPU assez proche du 486
      • Un 16450 UART : la sortie série est relié à un terminal (lui aussi émulé en Javascript) qui permet d'afficher la console que l'on voit.
      • 8259 Programmble Interrupt Controller / 8254 Programmble Interrupt Timer --> de quoi gérer les interruptions

      Tout le reste il n'y a pas : pas de disque dur, pas de réseau, pas de carte graphique, pas de carte son.

      Traduction à l'arache sur la partie abordant le CPU :

      • Pas de FPU, MMX, SSE. La partie FPU est émulée par Linux (comme au temps des 386 sans FPU).
      • Pas de vérifications de la limite et des droits sur les segments, parce que Linux n'en a pas besoin (QEMU fait pas pareil)
      • Pas CS/DS/ES/SS "segment overrides" --> ces registres de segment ne peuvent pas être utilisés explicitement par instructions assembleur. L'overrides de FS/GS overrides sont implémentés car "Thread Local Storage" de Linux en ont besoin.
      • Pas de single-settping
      • Pas de mode réel
      • Quelques rares instructions ne sont pas implémentées (BCD, BOUND, ...)
      • Pas de mode protégé 16 bits (bien que les instructions 16 bits soient implémentées)

      Perso, je me demande comment la partie réseau peut être implémentée, vu les restrictions des navigateurs pour tout ce qui est réseau.

      C'est assez bluffant en tout cas.

      • [^] # Re: Pour moi c'est un peu magique ...

        Posté par . Évalué à 5.

        Pas de vérifications de la limite et des droits sur les segments, parce que Linux n'en a pas besoin (QEMU fait pas pareil)

        Tu as fait un contre-sens ici : "The x86 emulator of QEMU has the same restriction" veut bien dire que QEMU fait pareil.

      • [^] # Re: Pour moi c'est un peu magique ...

        Posté par . Évalué à 3.

        je n'ai pas compris non plus comment ça fonctionne.

        Où sont hébergés le noyau, le système ?

        Dans la source HTML je ne vois que deux fichiers javascript que j'ai recopié avec l'index, et ça ne fonctionne pas en local.

        Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

        • [^] # Re: Pour moi c'est un peu magique ...

          Posté par . Évalué à 6.

          Dans la fonction load_binary il fait un appel ajax qui télecharge le noyau. Il faut donc surement que tu télecharges vmlinux26.bin et root.bin

          • [^] # Re: Pour moi c'est un peu magique ...

            Posté par . Évalué à 3.

            bien vu, maintenant je comprends mieux merci.

            Only wimps use tape backup: real men just upload their important stuff on megaupload, and let the rest of the world ~~mirror~~ link to it

  • # Le premier

    Posté par (page perso) . Évalué à 10.

    Et dans quelques années on se posera la question : "Qui était le premier, l'œuf ou la poule ?"

    Born to Kill EndUser !

  • # linux kernel module

    Posté par . Évalué à 5.

    Combien de temps avant que des gens s'amusent avec des modules kernel pour cette cible ? (webgl, carte son...)

    "La première sécurité est la liberté"

  • # Super

    Posté par . Évalué à 10.

    Aaahh, pouvoir tester l'effet d'un rm -rf / en étant root, autant de fois qu'on veut... priceless !

    • [^] # Re: Super

      Posté par . Évalué à 4.

      Taper "exit" aprés, c'est encore plus drôle.

    • [^] # Re: Super

      Posté par . Évalué à 6.

      Surtout pouvoir jouer à la kmem russian roulette...

      ~ # mknod /dev/urandom c 1 9                                                    
      ~ # cat russian                                                                 
      #! /bin/sh                                                                      
      
      i=0                                                                             
      while true                                                                      
      do                                                                              
      echo $i                                                                         
      dd if=/dev/urandom of=/dev/mem bs=1 count=1 seek=$RANDOM 2> /dev/null           
      let i=$i+1                                                                      
      done
      ~ # sh ./russian
      
      • [^] # Re: Super

        Posté par . Évalué à 2.

        Ce serait plus facile si on pouvait copier-coller du texte dans la console.

        • [^] # Re: Super

          Posté par (page perso) . Évalué à 2.

          Effectivement j'ai tout retapé pour tester et boom :

          334                                                                             
          BUG: unable to handle kernel NULL pointer dereference at virtual address 0000000
          0                                                                               
           printing eip:                                                                  
          00000000                                                                        
          *pde = 00000000                                                                 
          Oops: 0000 [#1]                                                                 
          invalid opcode: 0000 [#2]                                                       
          Recursive die() failure, output suppressed                                      
           <0>Kernel panic - not syncing: Fatal exception in interrupt
          

          C'est beau quand même !

      • [^] # Re: Super

        Posté par (page perso) . Évalué à 1.

        Dans ton script RANDOM vaut toujours zéro, donc tu passes ton temps à réécrire le premier octet de la mémoire qui contient un bout de l'adresse du gestionnaire d'interruption 01 … il ne doit pas se passer grand chose!

        • [^] # Re: Super

          Posté par . Évalué à 6.

          La variable $RANDOM est une variable shell qui retourne un nombre aléatoire. (par ex. echo $RANDOM $RANDOM)

          Donc ça marche!

          • [^] # Re: Super

            Posté par (page perso) . Évalué à 4.

            La variable $RANDOM est une variable shell

            Le shell en question n'est certainement pas sh comme tu l'as écrit dans ton programme, peut-être est-ce bash?

  • # Magic keys

    Posté par . Évalué à 5.

    Est-ce que vous avez testé les Magic SysRq key ? Le fameux REISUB ;)

  • # chromebook

    Posté par . Évalué à 3.

    Et béh, malgré la différence de perfomances (qui doit avoir ses raisons) entre Firefox4 et Chrome pour cet exploit, ce nouveau coup de force de Mr Bellard tombe à point nommé avec l'apparition des ChromeBooks ... Si, un exemple, une partie de la pile réseau devient fonctionnelle dans les prochaines releases, ça risque fort d'être très sympathique tout ça. Non ?

  • # pas besoin

    Posté par . Évalué à 9.

    il ne manque plus qu'à faire tourner X et on pourra alors faire tourner FF

    ya déjà emacs, autant dire qu'il n'est pas nécessaire de rajouter quoique ce soit

    • [^] # Re: pas besoin

      Posté par . Évalué à 10.

      l ne manque plus qu'à faire tourner X
      Du X dans un navigateur ? Ca existe depuis longtemps.

  • # Aller on compile Qt ?

    Posté par . Évalué à 0.

    ça serait cool non :-)

    • [^] # Re: Aller on compile Qt ?

      Posté par . Évalué à 2.

      Il "suffirait" de faire un driver framebuffer qui attaque du webgl ou un canvas.

      "La première sécurité est la liberté"

      • [^] # Re: Aller on compile Qt ?

        Posté par (page perso) . Évalué à 1.

        Mais pour ça il faudrait avoir le droit de modifier et redistribuer la bête avec l'accord de son auteur !
        Mais si tu veux remettre en forme le javascript et coder des périphériques et tenter quand même la redistribution, je te suis !

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.