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 :

Mode Protégé et Bochs 2.1.1


Sujet :

Assembleur

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut Mode Protégé et Bochs 2.1.1
    Bonjour a tous, je suis nouveau sur le site.

    Mon probleme est:
    je souhaite faire un petit programme (Loader) qui passe en mode protégé et de le tester avec Bochs. Le probleme c'est que cela ne marche pas et je ne sais pas pourquoi.

    J'ai ecris un boot qui charge le dit programme a l'adresse 0009:0000.

    Et Bochs m'indique l'erreur suivante:
    jump_protected: S=1: descriptor not executable
    exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting

    Je suis assez perplexe car mes descripteurs sont initialises comme il faut avec le bit S=0

    Si quelqu'un peut me venir en aide merci

    je joins le code complet de mon Loader, la compilation est faite via NASM.

    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
    ; 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
     
    PrintString:
    	pusha
    PrintStringLoop:	
            lodsb
            or      al,al
            je      PrintStringEnd
            mov     ah,0eh
            mov     bx,0007h
            int     10h
            jmp     PrintStringLoop
    PrintStringEnd:		
    	popa	
    	ret
     
    PrintChar:
    	push	ax
    PrintCharMSB:
    	shr	al,4
    	cmp	al,0Ah
    	jge	PrintCharMSBAlpha
    PrintCharMSBNum:
    	add	al,30h
    	jmp	PrintCharMSBEnd
    PrintCharMSBAlpha:		
    	add	al,37h
    PrintCharMSBEnd:
    	mov	ah,0Eh
    	mov	bx,0007h
    	int	10h
    PrintCharLSB:	
    	pop	ax
    	and	al,0fh
    	cmp	al,0Ah
    	jge	PrintCharLSBAlpha
    PrintCharLSBNum:
    	add	al,30h
    	jmp	PrintCharLSBEnd
    PrintCharLSBAlpha:		
    	add	al,37h
    PrintCharLSBEnd:
    	mov	ah,0Eh
    	mov	bx,0007h
    	int	10h
    	ret	
     
    PrintWord:
    	push	ax
    	mov	al,ah
    	call	PrintChar
    	pop	ax
    	call	PrintChar
    	ret
     
    PrintDWord:
    	push	eax
    	mov	si,LA(NewLine)
    	call	PrintString
    	push	eax
    	shr	eax,16
    	call	PrintWord
    	pop	eax
    	call	PrintWord	
    	pop	eax
    	ret	
     
    ; 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
    	mov	ax,LoaderSegment
    	mov	ds,ax
     
    	call	enable_a20       ; enable a20 gate
     
    	lgdt	[ss:gdt]
     
    	smsw	ax
    	or	al,1
    	lmsw	ax
     
    	db	0eah			; opcode for far jump (to set CS correctly)
    	dw	clear_pipe,08h
     
    [BITS 32]
    clear_pipe:
    ;	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:
    	; the first entry serves 2 purposes: as the GDT header and as the first descriptor
    	; note that the first descriptor (descriptor 0) is always a NULL-descriptor
    	db 	0xFF        ; full size of GDT used
    	db 	0xff        ;   which means 8192 descriptors * 8 bytes = 2^16 bytes
    	dw 	gdt         ;   address of GDT (dword)
    	dd 	0
    	; descriptor 1 - code:
    	dd 	0x0000ffff  ; base - limit: 0 - 0xfffff * 4K
    	dd 	0x008f9a00  ; type: 16 bit, exec-only conforming, <present>, privilege 0
    	; descriptor 2 - data/stack:
    	dd 	0x0000ffff  ; base - limit: 0 - 0xfffff * 4K
    	dd 	0x008f9200  ; type: 16 bit, data read/write, <present>, privilege 0

  2. #2
    Membre éprouvé Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Par défaut
    Bonjour et bienvenue parmi nous !

    Je suis désolé je n'y connais pas grand chose au mode protégé pour l'instant mais quelque chose me semble bizzare dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       dw    gdt         ;   address of GDT (dword)
    Tu définis un mot alors que dans ton commentaire tu dis que c'est un double-mot.

    Désolé si je dis n'importe quoi... Je ne connais pas trop ce sujet.
    En espérant t'avoir aidé.

    Nico*3-3
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Par défaut
    A mon avis le probleme ne vient pas de la...

    tu veux faire quoi exactement.. un boot qui passe en mode protégé?

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    Non, j'ai un boot qui charge un programme et c'est celui ci qui passe en mode protégé.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Par défaut
    D'accord...

    et ce programme que tu charge, il ne fait QUE passer en PM, ou bien il doit faire autre chose également?

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    pour le moment juste passer en mode protégé.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Par défaut
    Ben... ya pas mal de doc sur le net pour juste passer en mode protégé...

    Autrement si jamais tu trouve pas j'en ai qq unes sur mon PC, si tu veux je te les envoie...

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    J'ai beau parcourir le net, lire les docs Intel ou autre avec Bochs cela ne marche pas.

    Moi ce qui me plairais c'est savoir pourquoi mon code ne marche pas, est ce un probleme de reference memoire ou autre?

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Par défaut
    Ben ecoute je ne m'y connait pas trop...

    tout ce que je peux te dire, c'est de regarder un code qui passe en PM, et de voir comment il fonctionne, pour t'en inspirer par la suite

    Il y a le bootloader de SOS (sos.enix.org) qui passe en protégé...

  10. #10
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    Merci, je vais y jeter un oeil

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Par défaut
    Ok de rien :)

    puisque tu as l'air de savoir charger un programme à partir d'un bootloader... saurais tu comment faire pour charger un programme écrit en C?? (sujet ASM et C ds le forum)

    Merci

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

    J'ai trouvé une DOC sur le mode protégé en français qui explique même comment passer en PM sans rien (ce qui est ton cas). Ca a l'air très bien, mais je n'ai pas le temps de tout lire...

    Voilà le lien : http://www.chez.com/pageasm/tutd/pmode/index.htm
    J'espère que ça t'aidera...

    A bientôt !

    Nico*3-3
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Pardonnez-moi, mais...

    Que veut dire le 08h ?

  14. #14
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut
    en regardant rapidement (que la gdt), t'as un problème de déclaration correcte, voilà la structure d'une GDT:
    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
     
    gdt_summary:
    gdt_size dw offset gdt_end-offset gdt_start-1   ; c la limite et non pas la taille
    gdt_base dd offset gdt_start                    ; point d'entrée de gdt_start
    gdt_start:
    null_selector dd 0
                  dd 0             ; selector 0h
    real_cs_sel   dw 0FFFFh        ; selector 8h ; for back to real mode
                  dw 0
                  db 0
                  db 9Ah
                  db 0h
                  db 0
    real_ss_ds_es dw 0FFFFh        ; selector 10h ; for back to real mode
                  dw 0
                  db 0
                  db 92h
                  db 0h
                  db 0
    code_selector dw 0FFFFh        ; selector 18h
                  dw 0
                  db 0
                  db 9Ah
                  db 0CFh
                  db 0
    data_selector dw 0FFFFh        ; selector 20h
                  dw 0
                  db 0
                  db 92h
                  db 0CFh
                  db 0
    gdt_end:
    essaye déjà ça et après on verra parce que l'erreur que bochs te donne peut-être une caractéristique d'un problème de descripteur de gdt

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Les structures en assembleur c'est bien aussi ! :p

  16. #16
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Par défaut
    Que veut dire le 08h ?
    Cela indique la nouvelle valeur de CS, ici on le fait basculer sur le Code Descriptor.

    J'ai fait un nouveau test maintenant BOCHS indique une nouvelle erreur:
    jump_protected: dpl > CPL

    j'ai fait un log plus complet au niuveau de BOCHS et voila ce qu'il trouve:

    00004312158-i-@000000d4-[CPU ] cs_raw=8
    00004312158-i-@000000d4-[CPU ] dispBig=d4
    00004312158-i-@000000d4-[CPU ] selector value=8
    00004312158-i-@000000d4-[CPU ] selector index=1
    00004312158-i-@000000d4-[CPU ] selector ti=0
    00004312158-i-@000000d4-[CPU ] selector rpl=0
    00004312158-i-@000000d4-[CPU ] GDTR limit=39
    00004312158-i-@000000d4-[CPU ] GDTR limit=220
    00004312158-i-@000000d4-[CPU ] dword1=f000ff53
    00004312158-i-@000000d4-[CPU ] dword2=f000ff53
    00004312158-i-@000000d4-[CPU ] descriptor dpl=3
    00004312158-i-@000000d4-[CPU ] descriptor p=1
    00004312158-i-@000000d4-[CPU ] descriptor segment=1
    00004312158-i-@000000d4-[CPU ] descriptor type=f
    00004312158-i-@000000d4-[CPU ] descriptor exe=1
    00004312158-i-@000000d4-[CPU ] descriptor valid=1
    00004312158-e-@000000d4-[CPU ] jump_protected: dpl > CPL

    et on voit clairement qu'il trouve n'importe quoi

    Est ce un probleme BOCHS?

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

Discussions similaires

  1. Passage en mode protégé
    Par jojo's dans le forum Assembleur
    Réponses: 14
    Dernier message: 10/07/2004, 23h50
  2. Appel d'interruption DOS ou BIOS sous Windows (mode protégé)
    Par SteelBox dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 30/04/2004, 10h30
  3. Passage en mode protégé avec DPMI
    Par Hell_Hibou dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 09/09/2003, 19h04
  4. Les INT en mode protégé
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 8
    Dernier message: 05/12/2002, 16h13
  5. Mode protégé pour un OS
    Par Ninkosen dans le forum Programmation d'OS
    Réponses: 2
    Dernier message: 25/11/2002, 13h46

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