1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2014
    Messages : 28
    Points : 18
    Points
    18

    Par défaut Initialisation de la GDT.

    Bonjour tout le monde,

    Je suis actuellement en train de suivre le tutoriel : http://michelizza.developpez.com/rea...e-systeme/#LIV
    (Je suis débutant en programmation d'OS)

    Je suis actuellement bloqué sur la partie IV : "Programmer un secteur de boot qui passe en mode protégé".

    Il y a certains aspects que j'ai du mal a comprendre, je me tourne donc vers vous.

    Le premier point concerne ceci :
    Notre structure est donc maintenant correctement initialisée. Nous sommes maintenant presque prêt à passer en mode protégé. Avant cela, il faut inhiber les interruptions, car comme le système d'adressage va changer, les routines appelées par les interruptions ne seront plus valides après la bascule (il faudra les reprogrammer) :
    Ce que je comprend de cette phrase est que l'instruction cli désactive les IRQ.
    Ceci dans le but de d'éviter d'avoir des adresses fausses dans le vecteur d'interruption (car le système d'adressage change).

    Le problème est que l'on a associé aucune fonction a aucune interruption dans ce cours.
    Il y aurait donc des fonctions définis par défaut dans la table des interruptions ? Ceci est donc fait pour éviter d'avoir une IRQ qui déclenche une fonction non valide ?

    Je n'ai également pas bien compris ceci :
    L'instruction suivante réinitialise le sélecteur de code et exécute le noyau situé à l'adresse physique 0x1000. Cette instruction est essentielle, car elle permet, outre l'exécution du code du noyau, la réinitialisation correcte du sélecteur de code sur le bon descripteur (offset 0x8 dans la GDT) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ; réinitialise le segment de code
        jmp dword 0x8:0x1000
    Le fait de faire un jmp va mettre à jour le registre cs automatiquement ?
    Je n'ai pas bien compris pourquoi nous devons mettre un 0x8 ?

    Un dernier point :
    Chaque descripteur est initialisé de façon à pouvoir adresser l'ensemble de la RAM. La base de ces segments est à 0x0 avec une limite de 0xFFFFF pages (le bit G est à 1).
    Je trouve cela particulier de positionner deux segments différents sur la même plage d'adresse.
    J'aurais plutôt eu le réflexe de découper la RAM en deux dans le but de la partager pour mes deux segments.

    Le bit G étant positionné à 1, cela signifie que la limite est exprimé en page, combien d'octets font ces pages ?

    En vous remerciant,

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    7 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 7 010
    Points : 14 765
    Points
    14 765

    Par défaut

    Il y aurait donc des fonctions définis par défaut dans la table des interruptions ? Ceci est donc fait pour éviter d'avoir une IRQ qui déclenche une fonction non valide ?
    Oui, installés par le BIOS, la gestion du timer, du clavier, etc.
    Leur code en mode réel est incompatible avec le mode protégé. Par ailleurs, en mode protégé, il faut créer une table d'interruption IDT (comme pour la GDT) et la charger avec LIDT.

    Le fait de faire un jmp va mettre à jour le registre cs automatiquement ?
    Comme en mode réel une adresse se compose d'un segment et offset ex: 0x7c0:0000. La différence étant qu'un mode réel, tu ne mets plus une adresse de segment mais un numéro de descripteur de segments.
    le 0x8 correspond au second descripteur dans la GDT, un descripteur occupant 8 octets, et le premier devant être à 0. Ce long saut permet aussi la mise à jour des caches internes au CPU.

    Je trouve cela particulier de positionner deux segments différents sur la même plage d'adresse.
    J'aurais plutôt eu le réflexe de découper la RAM en deux dans le but de la partager pour mes deux segments.
    En mode protégé, il te faut au moins un segment de code et un segment de données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Le bit G étant positionné à 1, cela signifie que la limite est exprimé en page, combien d'octets font ces pages ?
    Il s'agit de blocs de 4K. Mais on ne parle pas de pages au sens pagination.

    La segmentation présente des fonctions de protections, tout comme la pagination, mais les deux sont autonomes et peuvent s'additionner. Dans la réalité, on utilise pas vraiment la segmentation pour la protection mais plutôt la pagination (cf chapitre gérer la mémoire virtuelle), il faut passer en mode protégé, et donc créer un minimum de segmentation pour pouvoir utiliser la pagination.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2014
    Messages : 28
    Points : 18
    Points
    18

    Par défaut

    Je te remercie pour ta réponse, je comprend déjà mieux.

    Pour accéder a mon segment de données, il faudrait donc que j'utilise une adresse du type : 0x10:1000.

    Cependant, un point reste floue.

    Dans le cas ou je mes le champ limite (d'une taille de 20 bits) de mon segment de code à 0xFFFFF, et le bit G à 1.

    Je me retrouve avec un segment de code de : 0xFFFFF * 4096 = 0xFFFFF000 octets.

    Cela me paraît beaucoup, surtout que j'ai également un autre segment de de données (car le mode protégé l'impose).

    Pour moi il n'est pas possible d'adresser 0xFFFFF000 * 2 octets avec un processeur 32 bits ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    7 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 7 010
    Points : 14 765
    Points
    14 765

    Par défaut

    ton segment de code ira de 0 à 0xFFFFFFFF, càd tout l'adressage possible.

    En général, un OS va créer un segment de code et un de données pouvant adresser toute la mémoire.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    février 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2014
    Messages : 28
    Points : 18
    Points
    18

    Par défaut

    Je te remercie une nouvelle fois pour ta réponse.

    Peux-tu me fournir le calcul que tu as fais pour en arriver a dire que mon segment de code ira de 0 à 0xFFFFFFFF ?

    En sachant que le champ limite est de 0xFFFFF (les 20 bits) et le bit G à 1.

    (En calculant, je tombe sur 0xFFFFF000 au lieu de 0xFFFFFFFF)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    7 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 7 010
    Points : 14 765
    Points
    14 765

    Par défaut

    Je n'ai pas fait de calcul, j'ai juste supposé que tous tes bits de limites sont à 1 et que le bit de granulité est activé.

    Si tu veux plus de détail sur la GDT :
    http://wiki.osdev.org/GDT et les liens en bas de la page.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. [Servlet] Fichiers d'initialisation
    Par david71 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 03/09/2003, 13h47
  2. Créer et initialiser un composant TStatusBar :help:
    Par James_ dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/08/2003, 08h52
  3. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 12h12
  4. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 10h08
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37

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