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

Assembleur Discussion :

Problème avec un secteur de boot en mode protégé...


Sujet :

Assembleur

  1. #1
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut Problème avec un secteur de boot en mode protégé...
    Bonjour !

    C'est la première fois que j'essaie de programmer en mode protégé !
    J'ai voulu le faire tout en créant un secteur de boot...

    Le programme est censé écrire 'RM' tant qu'il est en mode réel et remplacer le 'R' par un 'P' dès qu'il passe en mode protégé...

    Je teste ce programme avec Bochs (un émulateur de PC pour ceux qui ne sauraient pas...).
    Après avoir initialisé le BIOS, il passe en mode texte, affiche une lettre en haut à gauche et ensuite on dirait qu'il relance le PC, réinitialise le BIOS etc... et recommence la boucle infernale.
    Le tout en une fraction de seconde !

    Voici mon code (écrit avec FASM).
    Comme c'est la première fois que j'essaie il doit y avoir plein d'erreurs...

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    ;-------------------------------------------- Code en Mode Réel -------------------------------------------------------;
     
                                    use16
     
                                    mov             ax, 7C0h                    ;\
                                    mov             ds, ax                      ; \
                                    mov             es, ax                      ;  > Initialisation des segments
                                    mov             fs, ax                      ; /
                                    mov             gs, ax                      ;/
     
                                    mov             ax, 0B800h
                                    mov             es, ax
     
                                    cli                                         ;\
                                    mov             bx, 6000h                   ; \
                                    mov             sp, 0FFFFh                  ;  > Création de la pile
                                    mov             ss, bx                      ; /
                                    sti                                         ;/
     
                                    mov             ax, 0003h                   ;Passage en mode texte 80*25
                                    int             10h                         ;16 couleurs
     
                                    mov             word [es:0], 0F52h          ;'R'
                                    mov             word [es:2], 0F4Dh          ;'M'
     
     
    ;---------------------------------------- Passage en Mode Protégé -----------------------------------------------------;
     
                                    mov             eax, (7C0h*16)+GDT_Begin    ;Adresse linéaire de la GDT
                                    mov             dword [GDT_Pointer+2], eax
     
                                    cli
                                    lgdt            [GDT_Pointer]               ;Chargement de la GDT
                                    mov             ebx, cr0
                                    or              ebx, 00000001h              ;Passage en Mode Protégé
                                    mov             cr0, ebx
     
                                    jmp             PM_Activate
     
                                    use32
     
    PM_Activate:
     
                                    mov             ax, 2*8                     ;Second Descripteur
                                    mov             bx, 3*8                     ;Troisième Descripteur
                                    mov             cx, 4*8                     ;Quatrième descripteur (mémoire texte)
     
                                    mov             ds, ax                      ;\
                                    mov             gs, ax                      ; > Initialisation des selecteurs de segment
                                    mov             fs, ax                      ;/
     
                                    mov             es, cx
     
                                    mov             sp, bx                      ;Initialisation de la seconde pile
                                    mov             esp, 0000FFFFh              ;64 Kilo-octets suffiront
     
                                    mov             word [es:0], 0F50h          ;Remplace le 'R' par un 'P'
     
    fin:
                                    jmp             fin                         ;Boucle infinie
     
     
    ;**********************************************************************************************************************;
    ;************************************************** D O N N E E S *****************************************************;
    ;**********************************************************************************************************************;
     
    struc                           seg_descriptor  Lim0_15, Adr0_15, Adr16_23, Flags, Lim16_19, Adr24_31
    {                                                                           ;\
      .Limite_0_15                  dw              Lim0_15                     ; \
      .Adresse_0_15                 dw              Adr0_15                     ;  \
      .Adresse_16_23                db              Adr16_23                    ;   > Structure des descripteur
      .Flags                        db              Flags                       ;  /
      .Lim_16_19__Flags             db              Lim16_19                    ; /
      .Adresse_24_31                db              Adr24_31                    ;/
    }
     
    GDT_Begin:
     
      Null_Seg_Desc                 seg_descriptor  00000h, 0000h, 00h, 00000000b, 00000000b, 00h  ;
      Code_Seg_Desc                 seg_descriptor  0FFFFh, 0000h, 00h, 10011000b, 11001111b, 00h  ;Descripteurs de
      Data_Seg_Desc                 seg_descriptor  0FFFFh, 0000h, 00h, 10010010b, 11001111b, 00h  ;Segments
      Stack_Seg_Desc                seg_descriptor  0FFFFh, 7000h, 00h, 00010010b, 11000000b, 00h  ;
      Text_Seg_Desc                 seg_descriptor  16000 , 8000h, 0Bh, 00010010b, 11000000b, 00h  ;->Mémoire texte
      Graph_Seg_Desc                seg_descriptor  1000  , 0000h, 0Ah, 10010010b, 11000000b, 00h  ;->Mémoire graphique
                                                                                                   ;(usage futur)
     
      GDT_Limit                     equ             $-GDT_Begin
     
      GDT_Pointer:                  dw              GDT_Limit
                                    dd              0
     
     
    ;----------------------------------------------------------------------------------------------------------------------;
    ;--------                                          Remplissage                                                 --------;
    ;----------------------------------------------------------------------------------------------------------------------;
     
    Remplissage:
     
      times 510-Remplissage         db              0                           ;Remplissage
                                    dw              0AA55h                      ;du secteur
    Voilà...
    Je pense qu'il y a peut-être une erreur au niveau du jmp après le passage en mode protégé.

    Merci d'avance !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Il n'y aurait pas les commentaires, je n'aurais pas idée que ce puisse être un passage en pmode. Le gate A20 est relativement incontournable. Par ailleurs, il semblerait que la GDT soit mal définie. Vous avez déjà participé sur un thread qui en parle plus serieusement :

    http://www.developpez.net/forums/viewtopic.php?t=286864

  3. #3
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Désolé, mais je n'y connaissais rien !

    Et maintenant, je n'y connais pas grand chose non plus...
    J'ai lu une petite partie de la doc Intel, et la GDT me semble bien initialisée...
    Pour ce qui est de la A20 Gate, je ne sais même pas ce que c'est !

    Avez-vous un tutoriel où tout est bien expliqué ? Car ceux sur lesquels je suis tombé ne sont pas supers...

    Merci beaucoup !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Ben en fait... non... je ne connais pas de tutoriel bien :/ Pourtant j'ai cherché pas mal... Apparement, le passage par la GateA20 ne serait pas obligatoire, ce qui chamboule mes connaissances déjà assez vagues, issues du Tutoriel de Phylyp (pageasm)

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    Salut,

    En fait j'ai eu le meme probleme il y a peu. Et je confirme la gestion de la porte A20 n'est pas necessaire sous Bochs. Mais peu l'etre avec un Hardware.

    Le probleme ici viens de ton
    Celui ci doit effectue un far jmp et precise la nouvelle valeur de CS. qui doit pointer sur ton Code_Seg_Desc.(08h)

    Voila le code que j'ai mis en place pour moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	db 	66h,0eah 
    	dd 	"Adresse de ton label"
    	dw	08h
    De plus ta structure GDT_Pointer est mal initialise. En fait le "dd" ne doit pas etre initialiser a '0' car tu ne charge pas ta GDT au debut de la RAM.
    Ce Dword doit contenir l'adresse de ton label "GDT_Begin".

    J'espere que cela va t'aider.

  6. #6
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    J'ai fait le remplacement du jmp mais ça fait exactement la même chose...
    Je n'ai vraiment pas le temps de faire d'autres tests maintenant.

    Est-ce que vous voulez bien m'éclaircir sur ce qu'est l'A20 Gate, s'il vous plaît ?

    Merci d'avance...
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    est ton ami !

    http://www.win.tue.nl/~aeb/linux/kbd/A20.html
    ... et 48.200 autres liens
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  8. #8
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Merci Alcatîz pour ce lien, je n'ai pas eu le temps d'en chercher d'autres pour le moment...
    Mais je ne vois pas pour l'instant à quoi l'A20 Gate sert sur nos processeurs après le x286...

    Ensuite, ce qu'il me faudrait plutôt c'est un tutoriel sur le mode protégé, de préférence en français (mais bon, en anglais ça peut aller aussi) expliquant bien tout ça...

    Je ferai des recherches mais pour le moment je n'ai pas le temps de décortiquer toutes les réponses de Google, donc si tu en connais un bien, merci beaucoup !

    Merci d'avance !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  9. #9
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Bonjour !

    Voici mon code modifié pour utiliser le Gate A20 (je crois que j'ai compris ce que c'était ).
    Pour faire plus simple, je l'active avec l'interruption 15h -> Fonction 2401h du BIOS...
    Mais je ne sait pas si c'est suffisant.

    Voilà :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    ;-------------------------------------------- Code en Mode Réel -------------------------------------------------------;
     
                                    use16
     
                                    mov             ax, 7C0h                    ;\
                                    mov             ds, ax                      ; \
                                    mov             es, ax                      ;  > Initialisation des segments
                                    mov             fs, ax                      ; /
                                    mov             gs, ax                      ;/
     
                                    mov             ax, 0B800h
                                    mov             es, ax
     
                                    cli                                         ;\
                                    mov             bx, 6000h                   ; \
                                    mov             sp, 0FFFFh                  ;  > Création de la pile
                                    mov             ss, bx                      ; /
                                    sti                                         ;/
     
                                    mov             ax, 0003h                   ;Passage en mode texte 80*25
                                    int             10h                         ;16 couleurs
     
                                    mov             word [es:0], 0F52h          ;'R'
                                    mov             word [es:2], 0F4Dh          ;'M'
     
     
    ;---------------------------------------- Passage en Mode Protégé -----------------------------------------------------;
     
                                    mov             eax, (7C0h*16)+GDT_Begin    ;Adresse linéaire de la GDT
                                    mov             dword [GDT_Pointer+2], eax
     
                                    mov             ax, 2401h                   ;Positionner la Gate A20
                                    int             15h
     
                                    cli
                                    lgdt            [GDT_Pointer]               ;Chargement de la GDT
                                    mov             ebx, cr0
                                    or              ebx, 00000001h              ;Passage en Mode Protégé
                                    mov             cr0, ebx
     
                                    db              66h
                                    db              0EAh
                                    dd              7C00h+PM_Activate
                                    dw              8
     
                                    use32
     
    PM_Activate:
     
                                    mov             ax, 2*8                     ;Second Descripteur
                                    mov             bx, 3*8                     ;Troisième Descripteur
                                    mov             cx, 4*8                     ;Quatrième descripteur (mémoire texte)
     
                                    mov             ds, ax                      ;\
                                    mov             gs, ax                      ; > Initialisation des selecteurs de segment
                                    mov             fs, ax                      ;/
     
                                    mov             es, cx
     
                                    mov             sp, bx                      ;Initialisation de la seconde pile
                                    mov             esp, 0FFFFFFFFh             
     
                                    mov             word [es:0], 0F50h          ;Remplace le 'R' par un 'P'
     
    fin:
                                    jmp             fin                         ;Boucle infinie
     
     
    ;**********************************************************************************************************************;
    ;************************************************** D O N N E E S *****************************************************;
    ;**********************************************************************************************************************;
     
    use16
     
    struc                           seg_descriptor  Lim0_15, Adr0_15, Adr16_23, Flags, Lim16_19, Adr24_31
    {                                                                           ;\
      .Limite_0_15                  dw              Lim0_15                     ; \
      .Adresse_0_15                 dw              Adr0_15                     ;  \
      .Adresse_16_23                db              Adr16_23                    ;   > Structure des descripteur
      .Flags                        db              Flags                       ;  /
      .Lim_16_19__Flags             db              Lim16_19                    ; /
      .Adresse_24_31                db              Adr24_31                    ;/
    }
     
    GDT_Begin:
     
      Null_Seg_Desc                 seg_descriptor  00000h, 0000h, 00h, 00000000b, 00000000b, 00h  ;
      Code_Seg_Desc                 seg_descriptor  0FFFFh, 0000h, 00h, 10011000b, 11001111b, 00h  ;Descripteurs de
      Data_Seg_Desc                 seg_descriptor  0FFFFh, 0000h, 00h, 10010010b, 11001111b, 00h  ;Segments
      Stack_Seg_Desc                seg_descriptor  00000h, 0000h,0F0h, 00010010b, 11000100b, 00h  ;
      Text_Seg_Desc                 seg_descriptor  16000 , 8000h, 0Bh, 00010010b, 11000000b, 00h  ;Mémoire texte
      Graph_Seg_Desc                seg_descriptor  5000  , 0000h, 0Ah, 10010010b, 11000000b, 00h  ;Mémoire graphique
                                                                                                   ;(usage futur)
     
      GDT_Limit                     equ             $-GDT_Begin
     
      GDT_Pointer:                  dw              GDT_Limit
                                    dd              0
     
     
    ;----------------------------------------------------------------------------------------------------------------------;
    ;--------                                          Remplissage                                                 --------;
    ;----------------------------------------------------------------------------------------------------------------------;
     
    Remplissage:
     
      times 510-Remplissage         db              0                           ;Remplissage
                                    dw              0AA55h                      ;du secteur
    Ca fait toujours exactement la même chose !

    Est-ce un problème avec la Gate A20 (faudrait faire autre chose ?) ou avec le saut ? Ou avec les descripteurs ? Ou avec autre chose ?
    Pour répondre à KnightsOfTheRound, ma structure chargée comme pointeur sur la GDT est bien initialisée puisque l'adresse de base est 0 au déuts mais est ensuite modifiée.

    Désolé mais je n'y connais rien...

    Merci d'avance...
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    Salut,

    Je crois avoir des infos pour toi:

    1- Tu indique dans GDT_Pointer une base a '0', le probleme c'est qu'actuellement ta GDT n'est pas a l'adresse '0', mais a:
    7c00h + GDT_Begin

    2- quand tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lgdt     [GDT_POINTER]
    je te conseil de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov     ax,cs
    mov     ds,ax
    lgdt      [ds:GDT_POINTER]
    3- petit conseil, utilise de preference (E)AX car le proc gere plus vite et plus simplement ce registre.

  11. #11
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Salut !

    Désolé mais l'instruction lgdt store le registre gdtr le 6 octets qu'on lui passe (et ce n'est pas une adresse) donc ça ne change rien de faire lgdt [GDT_Pointer] ou lgdt [ds:GDT_Pointer]...
    Peut-être est-ce la syntaxe de FASM que tu n'as pas apprécié...

    Je cherche encore mais ça fais la même chose...

    Merci !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    en effet, pour ma part j'utilise NASM

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    Dans Bochs as tu activer le log, et si oui as tu une erreur?

  14. #14
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    En fait j'ai pas vraiment lu la doc de Bochs car je l'ai depuis peu de temps...
    Comment on active le log ? Est-ce que c'est "bochsout.txt" que ça donne ?
    Si oui je crois qu'il y a plusieurs problèmes :
    - SS = 6000h alors que ça devrait être 24
    - ES = B800h alors que ce devrais être 32
    Pour les autres registres de segment ça a l'air d'être bon :
    - FS = 16 (normal)
    - GS = 16 (normal)
    - CS = 8 (au moins ça ça a marché)

    Oups, je viens d'apercevoir une chose dans ce fichier :
    - int15: Func 24h, subfunc 01h, A20 gate control not supported

    Il doit y avoir une erreur à ce niveau déjà...
    Comment peut-on faire pour que le BIOS supporte cette fonction dans Bochs ?

    Merci d'avance...
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  15. #15
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    pour ma part je ne gere pas la porte A20

  16. #16
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Aïe je viens de trouver d'autres erreurs :

    A l'initilisation de la pile en PM, j'ai écrit :
    Faute monumentale !
    C'est ss qu'il faut mettre à la place de sp...
    Mais malgré ça il écrit toujours SS = 6000h dans le log.

    Il y a d'autres choses dans le log :

    - load_seg_reg: segment not present
    ==> Je ne vois pas trop à quoi ça peut correspondre...
    - fetch_raw_descriptor: GDT: index > limit
    ==> Ca doit être à cause de ss et es.

    Il faudrait d'abord dire à Bochs qu'on veut un BIOS qui supporte cette fonction, mais si ce n'est pas possible, il va falloir que j'active la Gate A20 moi-même...

    As-tu des idées ?

    PS : Tu as posté avant que j'ai fini ce message... Ton code fonctionne sans gérer la porte A20 ?
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  17. #17
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    oui en effet, mais mon code est prevu pour NASM.
    J'ai bien la gestion de la porte A20 mais je ne m'en sers pas.

    Voila mon code, il s'agit de mon loader qui est charge a l'adresse
    0000:9000 par le boot de ma D7.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
     
    ; Data for the Loader.
    %define LoaderAddress	0000h
    %define LoaderSegment	9000h
     
    ; Return the data at the address given by the offset "x".
    %define LA(x)	LoaderAddress + x
     
    ; Start
    [BITS 16]
    [ORG 0000h]
     
    	jmp	Start
     
    StartMsg	db	'Starting up...',0dh,0ah,00h
     
    NewLine		db	0dh,0ah,00h
     
    ; enables the a20 gate
    ;   the usual keyboard-enable-a20-gate-stuff
    enable_a20:
    	call	_a20_loop
    	jnz		_enable_a20_done
    	mov		al,0xd1
    	out		0x64,al
    	call	_a20_loop
    	jnz		_enable_a20_done
    	mov		al,0xdf
    	out		0x60,al
    _a20_loop:
    	mov		ecx,0x20000
    _loop2:
    	jmp		short _c
    _c:
    	in		al,0x64
    	test	al,0x2
    	loopne	_loop2
    _enable_a20_done:
    	ret
     
    Start:
     
    ; Initialize the segment register for datas.
    	mov	ax,LoaderSegment
    	mov	ds,ax
    	mov	es,ax
    	mov	ss,ax
    	xor	ax,ax
    	mov	sp,ax
     
    ; Display the welcome note
    	mov	si,LA(StartMsg)
    	call	PrintString	
     
    	cli
    ;	call	enable_a20       	; enable a20 gate
     
    	lgdt	[ss:gdt_summary]
     
    	smsw	ax
    	or	al,1
    	lmsw	ax
     
    	db 	66h,0eah 
    	dd 	90000h + clear_pipe 	;90000h -> LoaderSegment << 16 
    	dw	08h
     
    [BITS 32]
    clear_pipe:
    ; Setup all other selector.
    	mov	ax,10h
    	mov	ds,ax
    	mov	ss,ax
            mov	esp, 080000h
     
     
            mov	byte [ds:0B8000h], 'P'
            mov	byte [ds:0B8001h], 1Bh
     
    ; Infinit loop	
    InfLoop:
    	jmp	InfLoop
     
    gdt_summary: 
    gdt_size 	dw gdt_end - gdt_start	
    gdt_base 	dd 90000h + gdt_start           
    gdt_start: 
    null_selector 	dd 0 
                  	dd 0             ; selector 0h 
    code_selector 	dw 0FFFFh        ; selector 08h 
                  	dw 0 
                  	db 0 
                  	db 9Ah 
                  	db 0CFh 
                  	db 0 
    data_selector 	dw 0FFFFh        ; selector 10h 
                  	dw 0 
                  	db 0 
                  	db 92h 
                  	db 0CFh 
                  	db 0 
    gdt_end:

  18. #18
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Merci pour ton code. 8)
    Mais c'est quoi une D7 ?

    Je l'ai porté sur FASM, ça a fonctionné et ça m'a permit de m'apercevoir que c'était surtout une erreur de descripteur :

    J'ai testé après quelques modifications sans assigner ES en mode protégé (dans mon code) et ça a marché, je me suis donc demandé pourquoi.
    Pour le descripteur du segment de mémoire texte, j'ai voulu limiter ce segment à 80*25*2*4 (il y a 4 pages je crois...) : 16000 octets. Je n'ai donc pas mis le bit de Granularité à 1, or je ne devais pas avoir mes lunettes 8) et ce n'est pas le bit de granularité que j'ai mis à zéro mais le bit de présence mémoire !!! Je vous laisse imaginer la suite...).

    Voilà donc, ça fonctionne maintenant.
    Je poste mon code pour ceux que ça intéresse :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    ;-------------------------------------------- Code en Mode Réel -------------------------------------------------------;
     
                                    use16
     
                                    mov             ax, 7C0h                    ;\
                                    mov             ds, ax                      ; \
                                    mov             es, ax                      ;  > Initialisation des segments
                                    mov             fs, ax                      ; /
                                    mov             gs, ax                      ;/
     
                                    mov             ax, 0B800h
                                    mov             es, ax
     
                                    cli                                         ;\
                                    mov             bx, 6000h                   ; \
                                    mov             sp, 0FFFFh                  ;  > Création de la pile
                                    mov             ss, bx                      ; /
                                    sti                                         ;/
     
                                    mov             ax, 0003h                   ;Passage en mode texte 80*25
                                    int             10h                         ;16 couleurs
     
                                    mov             word [es:0], 0F52h          ;'R'
                                    mov             word [es:2], 0F4Dh          ;'M'
     
     
    ;---------------------------------------- Passage en Mode Protégé -----------------------------------------------------;
     
                                    mov             eax, (7C0h*16)+GDT_Begin    ;Adresse linéaire de la GDT
                                    mov             dword [GDT_Pointer+2], eax
     
    ;                                mov             ax, 2401h                   ;Positionner la Gate A20
    ;                                int             15h
     
                                    cli
                                    lgdt            [ds:GDT_Pointer]               ;Chargement de la GDT
                                    mov             ebx, cr0
                                    or              ebx, 00000001h              ;Passage en Mode Protégé
                                    mov             cr0, ebx
     
                                    db              66h
                                    db              0EAh
                                    dd              7C00h+PM_Activate
                                    dw              8
     
                                    use32
     
    PM_Activate:
     
                                    mov             ax, 16                      ;Second Descripteur
                                    mov             bx, 24                     ;Troisième Descripteur
                                    mov             cx, 32                     ;Quatrième descripteur (mémoire texte)
     
                                    mov             ds, ax                      ;\
                                    mov             gs, ax                      ; > Initialisation des selecteurs de segment
                                    mov             fs, ax                      ;/
     
                                    mov             es, cx
     
                                    mov             ss, bx                      ;Initialisation de la seconde pile
                                    mov             esp, 0FFFFFFFFh
     
                                    mov             byte [es:0], 'P'            ;Remplace le 'R' par un 'P'
     
                                    push            ax bx es                    ;Un test pour le segment de pile
                                    pop             es bx ax
     
    fin:
                                    jmp             fin                         ;Boucle infinie
     
     
    ;**********************************************************************************************************************;
    ;************************************************** D O N N E E S *****************************************************;
    ;**********************************************************************************************************************;
     
    use16
     
    struc                           seg_descriptor  Lim0_15, Adr0_15, Adr16_23, Flags, Lim16_19, Adr24_31
    {                                                                           ;\
      .Limite_0_15                  dw              Lim0_15                     ; \
      .Adresse_0_15                 dw              Adr0_15                     ;  \
      .Adresse_16_23                db              Adr16_23                    ;   > Structure des descripteur
      .Flags                        db              Flags                       ;  /
      .Lim_16_19__Flags             db              Lim16_19                    ; /
      .Adresse_24_31                db              Adr24_31                    ;/
    }
     
    GDT_Begin:
     
      Null_Seg_Desc                 seg_descriptor  00000h, 0000h, 00h, 00000000b, 00000000b, 00h  ;
      Code_Seg_Desc                 seg_descriptor  0FFFFh, 0000h, 00h, 10011000b, 11001111b, 00h  ;Descripteurs de
      Data_Seg_Desc                 seg_descriptor  0FFFFh, 0000h, 00h, 10010010b, 11001111b, 00h  ;Segments
      Stack_Seg_Desc                seg_descriptor  0FFFFh, 0000h, 06h, 10010110b, 01001111b, 00h  ; -> Pile (expand down)
      Text_Seg_Desc                 seg_descriptor  16000 , 8000h, 0Bh, 10010010b, 01000000b, 00h  ;Mémoire texte
      Graph_Seg_Desc                seg_descriptor  5000  , 0000h, 0Ah, 10010010b, 11000000b, 00h  ;Mémoire graphique
                                                                                                   ;(usage futur)
     
      GDT_Limit                     equ             $-GDT_Begin
     
      GDT_Pointer:                  dw              GDT_Limit
                                    dd              0
     
     
    ;----------------------------------------------------------------------------------------------------------------------;
    ;--------                                          Remplissage                                                 --------;
    ;----------------------------------------------------------------------------------------------------------------------;
     
    Remplissage:
     
      times 510-Remplissage         db              0                           ;Remplissage
                                    dw              0AA55h                      ;du secteur
    Voilà

    Merci beaucoup à tous ceux qui m'ont aidé, surtout KnightsOfTheRound !

    J'espère vous revoir bientôt...

    PS : Pensez-vous que ça puisse fonctionner sur un PC réel sans la gestion de la porte A20 :
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Secteur boot en mode protégé 32 bits
    Par Paul TOTH dans le forum Assembleur
    Réponses: 1
    Dernier message: 20/06/2012, 08h51
  2. Réponses: 5
    Dernier message: 08/10/2010, 08h45
  3. Réponses: 3
    Dernier message: 27/05/2009, 08h53
  4. Problème avec "Date()" en mode runtime
    Par bwalbourg dans le forum Runtime
    Réponses: 1
    Dernier message: 25/01/2006, 10h51

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