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

  1. #21
    Membre éclairé

    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
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bifur
    bon, j'ai essayé les deux image fournis sur machine réelle (un vieux pentium2 qui me sert pour tester mon ptit projet d'OS) et a part le message "ASTERIX BOOTDISK" rien d'autre ne s'affiche
    As-tu corrigé la géométrie de la disquette dans le BPB (car il s'agit ici d'une image possédant une géométrie particulière qui n'est pas nécéssairement adapté a ta disquette) ?
    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. #22
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par InitSreen Voir le message
    As-tu corrigé la géométrie de la disquette dans le BPB (car il s'agit ici d'une image possédant une géométrie particulière qui n'est pas nécéssairement adapté a ta disquette) ?
    ah bon ? dans quelle mesure ? (c'est bien de le préciser)

    par ailleurs je me suis vite fait penché sur le remote debugging avec VirtualBox (sous windows en l'occurrence), je confirme un comportement rigoureusement identique à celui observé sur qemu (LOADER copié avec mount sous Linux) (on aurait pu s'en douter mais encore fallait-il en être sûr), du coup ce qui m'interroge un peu;
    • d'où provient cette valeur de 0x5c00 ? elle est observée/déduite par quel biais ?
    • vous vous y prenez comment pour debugger de votre coté ? (quels outils etc.)


    je n'ai pas eu le temps de tester les disquettes montées avec WinImage, je jette un oeil d'ici ce soir

  3. #23
    Membre éclairé

    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
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par BufferBob
    ah bon ? dans quelle mesure ? (c'est bien de le préciser)
    La géométrie de la disquette varie en fonction de son fabricant, de sa taille et de son formattage, rapidemment voici la liste des géométrie reconnu pour les disquettes MS-DOS (et donc FAT). Sachant qu'une disquette doit garantir (pour être compatible) au moins les spec de cette liste. Si un support offre plus de secteur par piste ou plus de tête ou plus de cylindre, ceux-in seront simplement ignoré.

    Citation Envoyé par BufferBob
    d'où provient cette valeur de 0x5c00 ? elle est observée/déduite par quel biais ?
    cette partie du dernier code du LOADER affiche CS (chez moi cela affiche 0x0)
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov ax, cs
    mov cx, 0x10
    call _put_nb					; print current segment selector

    puis l'appel à la fonction _addr empile la valeur de IP pour le retour de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call _addr						; print offset of the next instruction (mov si, laddr(_lf))
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    _addr:
        push bp                 ; sauve BP
        mov bp, sp            ; BP pointe le sommet de la pile (old BP)
        add bp, 2               ; BP pointe la valeur de retour pour IP
        mov ax, [ss:bp]     ; la valeur de retour pour IP est mis dans AX
        mov cx, 0x10         ; base 16
        call _put_nb           ; affiche l'adresse
        mov si, laddr(_lf)
        call _put                 ; affiche le retour à la ligne
        pop bp
        ret
    j'obtient une adresse 0x5Cyz ou yz est l'offset de l'instruction suivant le Donc j'en conclue que le LOADER s'exécute à partir de l'adresse 0x0:0x5C00
    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. #24
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    As-tu corrigé la géométrie de la disquette dans le BPB (car il s'agit ici d'une image possédant une géométrie particulière qui n'est pas nécéssairement adapté a ta disquette) ?
    j'ai utillisé une disquette standard 1.44Mb qui semble correspondre aux paramêtre enregistré dans le BPB

    je pense avoir trouvé pourquoi ça merdoyait, il semble qu'il y ait une erreur au niveau de conversion dans la fonction _intx13
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    xor dx, dx							; clean DX
    				mov byte [ds:bp+4], cl				; save sector count (word_array[2])
    				mov cx, [bpbaddr(BPB_SecPerTrk)]	; CX = BPB_SecPerTrk
    				div cx								; AX =cylinder:head ; DX = sector number
    				push dx								; save sector number
    				xor dx, dx
    				mov cx, [bpbaddr(BPB_NumHeads)]		; CX = BPB_NumHeads
    				div cx								; AX =cylinder number ; DX = head number
    				mov byte [ds:bp+2], dl				; save head number for int 0x13 (word_array[1])
    on ne doit pas diviser par le nombre de secteur par piste mais par le nombre de secteur par cylindre, c'est a dire le nombre de secteur par piste multiplié par le nombre de tête (dans de nombreuse doc on ne fait pas la différence entre la piste et le cylindre)

    ensuite le résultat entier de cette division est la coordonnée de N° de cylindre (pas le numéros de secteur)

    la division suivante doit être celle du reste de la première par le nombre de tête, ce qui nous donne le numéos de tête et le reste de cette division est le numéros du secteur

    et en dernier faut pas oublier de rajouter 1 au numéros de secteur car leur numérotation commence par 1

    ce qui donne (si je reprend la source de AMORC.ASM et que je rajoute quelques commentaire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    mov cx,[bpbaddr(BPB_NumHeads)] 
    mov ax,[bpbaddr(BPB_SecPerTrk)] 
    mul cx   ;ax=nombre de secteur par cylindre
    mov cx,ax
    mov ax,bx   ;bx=numéros LBA du secteur
    xor dx,dx
    div cx
    mov bx,ax    ;bx=numéros de cylindre/numéros de piste
    mov ax,dx
    mov cl,[bpbaddr(BPB_NumHeads)]
    div cl          ;ah=numéros de secteur-1 al=numéros de tête
    inc ah        ah=numéros de secteur
     
    mov dh,al   ; a partir d'ici c'est pour adapter les données aux paramètre de la fonction lecture de l'int13h
    mov cx,bx  
    xchg cl,ch
    shl cl,6
    and cl,0C0h
    and ah,03Fh
    or cl,ah
    j'en suis sur a 95%

    un vieux pense bête a moi: http://bifur.olympe.in/?art=4

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    si c'est ça la modification va lui couter très cher à mon avis, la fonction _intx13 étant appelée plusieurs fois et le secteur dans lequel elle se trouve ne disposant plus que de 2 octets libres, le tout sans debugger...

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

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    mais non....
    si il optimise un peu son code il n'y as pas besoin de beaucoup plus de place, il peut aussi a mon avis réduire pas mal la taille de la fonction _put et en dernier recourt il peut réduire un peu la taille du texte

  7. #27
    Membre éclairé

    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
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    sauf que:

    N / (BPB_NumHeads * BPB_SecPerTrk) == ( N / BPB_SecPerTrk) / BPB_NumHeads
    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

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

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    j'ai testé la modif de la fonction eeeettt.......ça marche pas
    enfin pas tout a fait comme prévu, si je ne met pas le fichier loader dans la disquette il affiche un message d'erreur et redémarre (normal donc) mais si je met le fichier LOADER dans la disquette il affiche "ASTERIX BOOTDISK" en boucle

    j'ai du me planter quelque part.....

    N / (BPB_NumHeads * BPB_SecPerTrk) == ( N / BPB_SecPerTrk) / BPB_NumHeads
    effectivement c'est vrai a condition qu'il n'y ait pas de reste issue de ces division (ce qui n'est pas toujour le cas)
    Fichiers attachés Fichiers attachés

  9. #29
    Membre éclairé

    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
    Points : 738
    Points
    738
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bifur
    effectivement c'est vrai a condition qu'il n'y ait pas de reste issue de ces division (ce qui n'est pas toujour le cas)
    dans notre cas les restes de divisions sont récupérés au fur et a mesure donc le pb ne vient pas de la.
    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

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