IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation d'OS Assembleur Discussion :

Virtual Box saute à l'adresse 0x5C00 au lieu de 0x7C00


Sujet :

Programmation d'OS Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Billets dans le blog
    2
    Par défaut Virtual Box saute à l'adresse 0x5C00 au lieu de 0x7C00
    Bonjour,

    Mon probléme est le suivant :

    J'ai fait une disquette FAT12 bootable hardcoder à la main, le bootloader lit parfaitement le FS, charge un fichier exécutable à l'adresse 0x0000:0x7C00 puis effectue un saut à cette même adresse.

    Jusque là tout va bien, le problème c'est qu'une fois arrivé dans le fichier exe, on est à l'adresse 0X05C00 alors que les adresses sont codées en dur dans le code, j'ai supposé que cela venait de VirtualBox mais je ne trouve rien sur le sujet.

    Quelqu'un voit-il quoi faire ou d'où vient le problème ?

    Les codes
    Fichiers attachés Fichiers attachés
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je comprends pas tout à fait, quand tu dis "jusque là tout va bien" tu veux dire que les codes que tu as mis en pièce jointe fonctionnent ? (auquel cas c'est peut-être le LOADER qu'il faudrait mettre non ?)

    j'ai essayé vite fait sans trop chercher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nasm -f bin nasm -f bin VBR_FAT12.asm -o floppy.img
    qemu-system-i386.exe -fda floppy.img
    j'ai également essayé avec virtualbox (créer une machine other/unknown, ajouter un floppy tout en haut de la liste, en virant le controleur ide par défaut au besoin, charger l'img, lancer la vm), tout fonctionne à priori au mieux de ce qu'on peut faire avec ce que tu nous donne (qemu & vbox), c'est à dire l'affichage de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ASTERIX BOOTDISK
    File not found: /LOADER
    The system will be restart in 3 seconds.
    ps: ce serait plutôt restarted ;o)

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Billets dans le blog
    2
    Par défaut
    Effectivement, il manque le loader. Pour l'ajouter à l'image, il faut utiliser la commande mount :

    Sous Linux :
    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mount -t msdos -o loop /chemin/vers/l/image /mnt/fdd0
    cp /chemin/vers/le/loader /mnt/fdd0/LOADER
    umount -t msdos /mnt/fdd0

    Dans le code, il y a une macro pour tester les deux cas.

    PS : mon anglais est plus que douteux, il est fort possible que tu aies raison.
    Fichiers attachés Fichiers attachés
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    j'ai regardé un peu plus en détail,

    le code tourne, il se reloge convenablement en 0:600, ce qui occasionne (jmp 0x0:reloc(_load_dvr)) un jmp 0:65f, jusque là pas de souci
    le problème survient dans le _jmp_loader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    _start:
    (...)
       _jmp_loader:
          mov dl, [bpbaddr(BS_DrvNum)]     ; Retore disk ID
          jmp 0x0000:VBR_LOADADDR          ; jump in loader file
    concrètement l'opcode est jmp 0:7c00, sauf qu'il n'y a rien en 0x7c00, donc pour moi le secteur n'est simplement pas chargé, et la vérification d'erreur peut-être pas adéquate (le jc short .readdisk c'est bien ça ?)

    j'ai pas investigué plus (je me suis surtout contenté de tracer le code en vérité ici), pour debugger j'ai utilisé gdb et qemu (mais c'est possiblement faisable avec vbox également)

    d'un coté (bind sur localhost) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qemu-system-i386 -boot a -fda floppy.img -S -gdb tcp:0.0.0.0:1234,ipv4
    de l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ gdb -q
    (gdb) set architecture i8086
    (gdb) set disassembly-flavor intel
    (gdb) target remote parsifal:1234
    (gdb) break *0x7c00
    (gdb) continue
    (gdb) x/40i 0x7c41
    etc.
    si besoin je continuerai d'investiguer dans la soirée je pense

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    bon, c'est bien compliqué tout ça, j'ai tracé quasiment l'intégralité du code, concrètement au moment de charger le fichier ça charge bien quelque chose qui écrase la mémoire en 0x7c00, mais ce n'est pas le fichier
    je suis pas du tout expert de la FAT12 mais j'ai l'impression que l'entrée dans la FAT pour déterminer les clusters utilisés par le fichier est un peu étrange:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0xa00:  0xf0    0xff    0xff    0x00    0xf0    0xff    0x00    0x00
    ce qui revient à ff0 - fff - 000 - fff, je sais pas comment l’interpréter, la première entrée est celle du volume ça ok, mais la deuxième sous-entendrait qu'il s'agit d'un cluster vide ?

    tu observes la même chose ? tu as avancé de ton côté ?

  6. #6
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    est ce que vous êtes au courant que les deux premier cluster n'existent pas? parce que sinon vous chargez peut être deux cluster plus loin

    edit: après un bon repas et une lecture vite faite des codes source fournit il ne me semble pas que vous ayez prit en compte le fait que les deux premier cluster (le 0 et le 1) n'existe pas dans la zone de donnée, car 0= cluster vide et 1=cluster réservé
    ....le premier cluster dans la zone de donnée est donc le cluster 2

    un mauvais calcul de la taille occupé par le repertoire racine peut aussi créer des problème (le parametre a l'offset 17 est le nombre d'entrée du repertoire (32 octets) et pas le nombre de secteur du répertoire racine)

    je vous refilerait bien le code source de mon vieux amorceur pour disquette mais après vérification il n'y as aucun commentaire (erreur de jeunesse) et il ne vous aidera pas vraiment

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/07/2007, 15h11
  2. Virtual box+ DVD restauration XP
    Par goule71 dans le forum Installation
    Réponses: 2
    Dernier message: 05/07/2007, 17h22
  3. Virtualisation avec Virtual Box
    Par belaggoun2000 dans le forum Administration système
    Réponses: 3
    Dernier message: 23/06/2007, 11h07
  4. problème avec Virtual Box
    Par belaggoun2000 dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 19/06/2007, 11h09
  5. Virtual Box : Ou est stocké le lecteur
    Par goule71 dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 16/06/2007, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo