Accueil > > > PASSER EN MODE PROTÉGÉ [MASM]
PASSER EN MODE PROTÉGÉ [MASM]
Information sur la source
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".
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|