Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PASSER EN MODE PROTÉGÉ [MASM]


Information sur la source

Catégorie :divers Niveau : Initié Date de création : 15/12/2002 Date de mise à jour : 15/12/2002 10:19:24 Vu : 2 684

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

Voici un code simple pour passer en mode protégé et revenir en mode réel.
Comme le seul fait de passer en PMODE me semble assez incomplet, le code charge également la GDT.

Le programme une fois assemblé ne fait RIEN (et oui le PMODE c'est invisible).
Il se lance sous DOS toutefois il est en 32bits et utilise une segmentation de type flat. Vous remarquerez sans doute qu'en mode protégé on utilise 2 descripteur pour le même segment, ceci vient du fait que le premier désigne le segment de code (possédant les droits de lecture/exécution) tandis que le second est le segment de données/pile (possédant les droits de lecture/écriture).

Si vous désirez avoir plus de renseignement sur le PMODE et plus (le multitâche ou le paging), faites un tour sur http://developer.intel.com
 

Source

  • .386p
  • .dosseg
  • assume cs:pmode,ds:pmode,ss:pmode,es:pmode,fs:nothing,gs:nothing
  • pmode segment public use32
  • startGDT: ;la GDT
  • null dw 0,\ ;le descripteur nul
  • 00h
  • db 00h,\
  • 00000000b,\
  • 00000000b,\
  • 00h
  • code32 dw 00ffffh,\ ;le descripteur du segment de code
  • 00h
  • db 00h,\
  • 10011010b,\
  • 11001111b,\
  • 00h
  • data32 dw 00ffffh,\ ;le descripteur du segment de données/pile
  • 00h
  • db 00h,\
  • 10010010b,\
  • 11001111b,\
  • 00h
  • endGDT:
  • pGDT dw endGDT-startGDT-1 ;le pointeur sur la GDT
  • dd 0
  • startup: ;point d'entrée du programme
  • mov eax,pmode ;initialise le selecteur du segment de données
  • mov ds,eax
  • mov eax,ds ;initalise du pointeur sur la GDT
  • shl eax,4
  • add eax,startGDT
  • mov dword ptr [pGDT+02h],eax
  • mov eax,pmode ;sauvegarde le segment courant
  • mov gs,eax
  • cli ;désactive les interruptions masquables
  • in eax,70h ;désactive les NMIs
  • or eax,10000000b
  • out 70h,eax
  • mov eax,cr0 ;teste la présence du mode protégé
  • test eax,00000001b
  • jnz exit ;génère une erreur (une sortie directe du programme) si le CPU est déjà en PMODE
  • lgdt fword ptr [pGDT] ;charge la GDT en mémoire
  • or eax,00000001b ;passe en mode protégé
  • mov cr0,eax
  • jmp far ptr entry ;reinitialise la queue d'instructions
  • entry:
  • mov eax,10h ;reinitialise le sélecteur du segment de données
  • mov ds,eax
  • mov ss,eax ;reinitialise le sélecteur du segment de pile
  • mov esp,1000000h
  • mov es,eax ;reinitialise le sélecteur du segment de données supplémentaire
  • mov eax,cr0 ;repasse en mode réel
  • and eax,01100000000000000000000000010000b
  • mov cr0,eax
  • jmp far ptr back ;reinitialise la queue d'instructions
  • back:
  • mov eax,gs ;reinitialise le sélecteur du segment de données
  • mov ds,eax
  • mov ss,eax ;reinitialise le sélecteur du segment de pile
  • mov es,eax ;reinitialise le sélecteur du segment de données supplémentaire
  • exit:
  • in eax,70h ;réactive les NMIs
  • and eax,7fh
  • out 70h,eax
  • sti ;réactive les interruptions masquables
  • mov eax,4c00h ;rend le contrôle au DOS
  • int 21h
  • pmode ends
  • end startup
.386p
.dosseg

assume cs:pmode,ds:pmode,ss:pmode,es:pmode,fs:nothing,gs:nothing


pmode segment public use32

startGDT:			;la GDT
null dw 0,\			;le descripteur nul
  00h
db 00h,\
  00000000b,\
  00000000b,\
  00h
code32 dw 00ffffh,\		;le descripteur du segment de code
  00h
db 00h,\
  10011010b,\
  11001111b,\
  00h
data32 dw 00ffffh,\		;le descripteur du segment de données/pile
  00h
db 00h,\
  10010010b,\
  11001111b,\
  00h
endGDT:

pGDT dw endGDT-startGDT-1		;le pointeur sur la GDT
dd 0

startup:		;point d'entrée du programme
mov eax,pmode		;initialise le selecteur du segment de données
mov ds,eax

mov eax,ds				;initalise du pointeur sur la GDT
shl eax,4
add eax,startGDT
mov dword ptr [pGDT+02h],eax

mov eax,pmode		;sauvegarde le segment courant
mov gs,eax

cli		;désactive les interruptions masquables

in eax,70h		;désactive les NMIs
or eax,10000000b
out 70h,eax

mov eax,cr0		;teste la présence du mode protégé
test eax,00000001b
jnz exit		;génère une erreur (une sortie directe du programme) si le CPU est déjà en PMODE

lgdt fword ptr [pGDT]		;charge la GDT en mémoire

or eax,00000001b		;passe en mode protégé
mov cr0,eax

jmp far ptr entry		;reinitialise la queue d'instructions

entry:
mov eax,10h		;reinitialise le sélecteur du segment de données
mov ds,eax

mov ss,eax		;reinitialise le sélecteur du segment de pile
mov esp,1000000h

mov es,eax		;reinitialise le sélecteur du segment de données supplémentaire

mov eax,cr0						;repasse en mode réel
and eax,01100000000000000000000000010000b
mov cr0,eax

jmp far ptr back		;reinitialise la queue d'instructions

back:
mov eax,gs		;reinitialise le sélecteur du segment de données
mov ds,eax

mov ss,eax		;reinitialise le sélecteur du segment de pile

mov es,eax		;reinitialise le sélecteur du segment de données supplémentaire

exit:
in eax,70h		;réactive les NMIs
and eax,7fh
out 70h,eax

sti		;réactive les interruptions masquables

mov eax,4c00h		;rend le contrôle au DOS
int 21h

pmode ends


end startup

Conclusion

Pour ceux qui ne sauraient pas "GDT" veut dire "Global Descriptor Table" et NMI "Non-Maskable Interruption".
 

Commentaires et avis

signaler à un administrateur
Commentaire de Bombela le 26/06/2004 13:22:11

Le CLI désactive TOUTES les interruptions !
C'est le CPU qui ne vas plus réagirs au interruptions !
Donc, ça sert à rien de programmer le PIC du PC pour masquer les interruptions !

@+

signaler à un administrateur
Commentaire de TheLudo2013 le 03/08/2004 11:53:16

bombela < les nmi (non-maskable interrupt) bien que quasiment jamais déclenchées (enfin vaut mieux pas, puisqu'elle signifient par ex. que la ram est dead) ne sont pas inhibées par "cli" ;)
la programmation du pic est donc indispensable pour les inhiber....

signaler à un administrateur
Commentaire de Bombela le 03/08/2004 13:49:45

Oui ! Tu a tout a fait raison !

Je me suis aperçus de ma bourde un peux plus tard !
Mais comme t'avais pas répondu, j'ai pas pris le temps de corriger !

Mauvais garçons que je suis ! Blaf ! Une baffe pour moi ;0)

@+

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,34 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.