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 :

Passage en mode protégé


Sujet :

Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 29
    Points : 12
    Points
    12
    Par défaut Passage en mode protégé
    salut vous,

    je me suis penché sur le sujet 'protected mode', faut bien évoluer, et je me demandait quel était l'avantage de passer en pmode dans un prog **.com. Windaube autorisera-t-il l'adressage des 4Go disponibles.J'ai lu qu'il ne pouvait y avoir qu'une seule gdt, ça veut dire que 'lgdt' ne marche qu'une fois par boot?Le pmode n'aurait-il pas un sens seulement pour developper un OS?
    Merci pour la doc,surtout si elle est en français.
    Voilà ce que j'ai trouvé jusqu'ici:
    http://kos.enix.org/~d2/snapshots/ko...tml/node4.html
    http://membres.lycos.fr/dreamos/owl-...cted_mode.html
    http://moostik.vanasthali.com/homepa...=Interruptions
    Mais il m'en faut plus....

  2. #2
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    salut jojo's !
    comme doc il y a bien sûr l'incontournable: "Intel Architecture Software Developpers Manual". C'est compliqué, c'est en anglais mais c'est complet.
    Sinon comme autres sites sympas, ya ça:
    http://i386.cybersabotage.com/
    http://inferno.cs.univ-paris8.fr/~am...utorial00.html
    http://home.swipnet.se/smaffy/asm/in...edApproach.txt
    J'en connaissais bien plus avant mais j'ai perdu toutes mes docs.
    J'ai lu qu'il ne pouvait y avoir qu'une seule gdt, ça veut dire que 'lgdt' ne marche qu'une fois par boot ?
    non, ça veut juste dire que si l'on charge une nouvelle gdt via 'lgdt', l'ancienne sera écrasée.
    Windaube autorisera-t-il l'adressage des 4Go disponibles
    oui, mais tu n'auras pas accès à toutes la RAM sous windows, à cause des privilèges. Le moyen pour contourner ça c'est d'utiliser un driver.
    Le pmode n'aurait-il pas un sens seulement pour developper un OS?
    non, le pmode sert à adresser 4 Go de RAM contrairement au rmode qui n'en adresse que 1 Mo. Si veux afficher ne serait-ce qu'une image d'une taille supérieure à 1 Mo, tu ne pourra pas le faire si tu reste en rmode d'ou l'utilité d'être en pmode. Par contre tu ne peut pas passer comme ça en pmode sous windows à partir d'un .com, tu va devoir utiliser le fameux DPMI.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    merci albus,cool tes url, j'y vois plus clair
    sinon, côté calto, ça avance?

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 125
    Points : 117
    Points
    117
    Par défaut
    J'ai lu qu'il ne pouvait y avoir qu'une seule gdt, ça veut dire que 'lgdt' ne marche qu'une fois par boot ?
    non, ça veut juste dire que si l'on charge une nouvelle gdt via 'lgdt', l'ancienne sera écrasée.
    Albus,cela veut il dire qu'il y a une autre facon autre que 'lgdt' qui [ermet de loader une nouvelle gdt de facon a ne pas ecraser l'ancienne : : .Car c'est tout ce que j'ai reussi a comprendre dans:
    non, ça veut juste dire que si l'on charge une nouvelle gdt via 'lgdt', l'ancienne sera écrasée.
    Merci de m'eclaircir sur ce point????Et le calto??

  5. #5
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Je ne pense pas qu'il y ai une autre façon de charger la GDT que 'lgdt', mis a part si on modifie directement la gdt déjà chargé. Par exemple:
    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
     
    lgdt	[_pgdt]			;charge la GDT
    ;***************************
    ;ensuite si l'on veut modifier directement la gdt, on peut faire comme ça:
    mov [_gdt_cs+2], word 0xFFFF   ;modifie l'adresse de la base
    ;***************************
     
    _gdt:
    	db 0,0,0,0,0,0,0,0
    _gdt_cs:							;le descripteur du segment de code
    	dw	0x0FFFF				;seg_length0_15 
    	dw	0x0000				;base_addr0_15
    	db	0x00				;base_addr16_23
    	db 	10011011b			;1[P]2[DPL]1[DT]4[TYPE]
    	db	11001111b			;4[Sg. length 19:16]1[AVL]1[0]1[D]1[G]
    	db	0x00				;base_addr24_31
    _gdt_ds:							;le descripteur du segment de données et de pile
    	dw	0x0FFFF				;seg_length0_15 
    	dw	0x0000				;base_addr0_15
    	db	0x00				;base_addr16_23
    	db 	10010011b			;1[P]2[DPL]1[DT]4[TYPE]
    	db	11001111b			;4[Sg. length 19:16]1[AVL]1[0]1[D]1[G]
    	db	0x00				;base_addr24_31
    _gdt_fin:
     
    _pgdt:
    	dw	_gdt_fin-_gdt-1		;limite
    	dd	_gdt			;base
    Je n'ai pas testé ce code, je ne sais pas si il marche mais le principe est là.

    Pour ce qui est de la calto, en ce moment je bosse sur le noyau, je sèche un peu sur le chargement des descripteurs de segment par le DPMI mais je ne baisserais pas les bras ! En parallèle je bosse sur un truc pour le site de la calto, c'est un script qui va permettre de mettre à jour toutes les sources du projet, un peu comme CVS (mais en moin bien).

  6. #6
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 125
    Points : 117
    Points
    117
    Par défaut
    Ok je vois mieux alors en ce qui concerne 'lgdt'

    Heureux pour la calto.

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    dites moi si je me plante comme une grosse buse...
    -Un prog ne peut changer la GDT car en dehors du SE aucun n'a le privilege requis pour le faire??
    -Si l'utilisateur parvient à passer en ring0, il peut planter volontairement ou non le SE??

  8. #8
    Membre régulier

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Hello,

    -Un prog ne peut changer la GDT car en dehors du SE aucun n'a le privilege requis pour le faire??
    si prog est du code en mode user alors il lui est interdit d'executer l'instruction lgdt. S'il outrepasse il provoque une erreur de proctection ayant en general pour consequence l'elimination du processus incriminé.

    si prog est un driver sur la couche 1 ou 2 il y a de fortes chances que le se interdise lgdt

    si prog est un driver en couche 0 (au niveau du se) alors oui il pourrait executer lgdt au risque de compromettre la stabilité du systeme

    -Si l'utilisateur parvient à passer en ring0, il peut planter volontairement ou non le SE??

    oui, mais je suppose (je ne l'ai jamais fait mais c'est sans doute possible) qu"il est difficile de passer en ring0 lorsque qu'on est en mode user.
    En revanche il est parfaitement possible de développer un driver qui tournera en ring0 mais l'utilisateur installe délibéremment ce driver a ces risques et périls.




    golem
    +++

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    c'est bien ce que je pensais....
    autres questions:
    -en Pmode,on peut bosser en 16 ou 32 bits en l'indiquant de le descripteur de segment,n'est-ce pas? en 32 bits,le processeur ne manipule exclusivement que des registres 32 bits???push ax ne fonctionne pas, seulement push eax????
    -quelles differences y a t-il entre un programme 16 et 32 bits?????On peut pourtant executer des instructions 32 bits en 16 bits grace a des prefixes,non?? :

  10. #10
    Membre actif

    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
    Points : 279
    Points
    279
    Par défaut
    Salut

    - En Pmode, tu peux effectivement bosser en 16 ou 32 bits grâce au descripteur de segment à condition que ça soit bien déclarer au niveau de ta GDT mais il faut faire bien attention avec ce genre de choses, faut respecter les priorités de privilège, ne pas oublier de faire un jump far ou quelque chose dans ce style (ret far ....)

    - En 32 bits, tu peux manipuler des 16 bits grâce aux préfixes de la même manière que tu peux le faire en 16 bits pour utiliser des 32 bits : c'est les préfixes 66h et 67h, ils marchent dans les deux sens heureusement.

    Bon amusement ...

    Le mage tophinus (de rapide passage...)

  11. #11
    Membre du Club Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Points : 63
    Points
    63
    Par défaut
    J'aime vraiment les débats sur les bases de l'asm : ca permet de se conforter !
    Bon, je rajoute ma couche :
    on dit toujours qu'avec l'addressage segment:offset, on peut adresser 4Go, car 2^32 => 4Go
    mais on dit que le segment est un registre de 16 géré come un registre de 20bits,
    ou les 4 bits manquants sont ceux de plus faible poids...
    D'ou le fait qu'on puisse donner plusieurs adresses différentes pour une meme donnée.
    Oui, mais dans ce cas, on devrait aller jusqu'a 2^20, pas plus...
    Je me gourre, mais OU ???????

  12. #12
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    avec l'adressage sqegment:offset on adresse 1Mega et non 4Go
    (tu l'fé expres ?)
    le recouvrement du segment et de l'offset ne donne en effet que 20 bits (16bits sur les 8088 !) soit 2^20=1048576=1Meg
    (pardon pr les notations, c des migioctet maintenant ?)

    avec un adressage 32 bits, on arrive au 4Go

    Un ancetre est revenu, ca fé plaisir de te voir passé le mage tophinus !

  13. #13
    Membre du Club Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Points : 63
    Points
    63
    Par défaut
    Merci !
    donc quand on passe au mode protégé, on change automatiquement de mode d'addressage :
    le segment est le prolongement dans la continuité de l'offset....?
    Si c'est ca, je comprend enfin tout....
    et pourquoi les modes sont dits a adressages différents, tout bonnement...
    C'est ca, rassurez moi ? Je vais me coucher moins .... merci !

    Content aussi de revoir notre mage préféré !

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 29
    Points : 12
    Points
    12
    Par défaut
    non , je crois pas ....
    d'ailleur, pourquoi lorsque l'on initialise le selecteur de registre 'cs' par un 'jmp far' juste apres le passage en pmode le processeur autorise le saut vers un segment ring0 alors que 'cs' à cet instant pointe sur n'importe quoi,non?

  15. #15
    Membre actif

    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
    Points : 279
    Points
    279
    Par défaut
    Bon alors, les modes d'adressages sont différents en mode réel et en mode protégé parce que ça fonctionne pas du tout de la même manière dans chacun de ces modes :
    1) en mode réel, on a segment:offset avec l'adresse=segment*10h+offset, donc en gros l'adresse maximale c'est 0FFFFFh soit en décimal 1048575 auquel on rajoute 1 parce qu'il existe l'adresse 00000h, cela nous fait 1048576, on divise par 1024 pour avec des kilo-octets et on redivise par 1024 et Oh miracle, on tombe tout pile sur 1méga-octet (c'est bien fait la science )
    2) en mode protégé (pour simplifier), le segment est appelé descripteur, en fait il sert à aller voir dans la GDT (Global Descriptor Table) si le segment peut adresser la zone mémoire contenue dans l'offset. Je sens que ça deviens compliqué alors j'm'explique public. Je prend par exemple 08h:12345678h. Quand le proc reçoit cette adresse là, il pointe sur le descripteur 08h de la GDT qui elle-même donne la zone d'adressage possible, c'est à dire soit les 4 GO disponibles, soit un espace restreint de mémoire, mais ça personne ne le sait sauf le programmeur de la GDT. En plus, pour en rajouter une petite couche, ce descripteur sert aussi, en pointant dans la GDT, de savoir si ton code est en 16 ou 32 bits (là il faut aller voir les cours sur la GDT même si c'est en anglais). Voilà pour le descripteur. Supposons qu'avec ce descripteur on puisse utiliser les 4GO disponibles (pas de restriction au niveau de la GDT). Il ne reste plus que l'adresse qui est en fait uniquement l'offset cette fois-ci (contrairement au mode réel). L'offset 32 bits peut aller de 00000000h à 0FFFFFFFFh soit 4294967296 octets (diviser par 1024, puis diviser par 1024, puis diviser par 1024) nous donne 4 giga-octets adressables.

    J'espère que j'ai été clair est pas trop long

    PS : merci de votre compassion les gars, ça fait plaisir de vous revoir aussi

Discussions similaires

  1. Bootloader et Kernel, passage mode protégé ↔ réel
    Par qnop dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 08/02/2012, 23h44
  2. Passage en mode protégé
    Par Nyarlathotep dans le forum Assembleur
    Réponses: 1
    Dernier message: 02/02/2007, 21h39
  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, 20h04
  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, 17h13
  5. Mode protégé pour un OS
    Par Ninkosen dans le forum Programmation d'OS
    Réponses: 2
    Dernier message: 25/11/2002, 14h46

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