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 :

Question sur la segmentation mémoire


Sujet :

Assembleur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    Par défaut Question sur la segmentation mémoire
    Bonjour,

    C'est à propos du tutoriel de Benoît-M dans le chapitre sur la segmentation mémoire où il parle d'une subtilité : http://benoit-m.developpez.com/assem.../Partie1-2.php

    Si je comprends bien, les segments peuvent se chevaucher et donc les 64ko de taille ne sont qu'un maximum de la taille que peut avoir un segment ?

    Ensuite un doute me gagne sur cette phrase :
    La conséquence immédiate de tout cela est qu'un octet n'a pas une adresse unique. Par exemple, l'octet numéro 66 peut être adressé par 0000:0042, mais aussi par 0001:0032, par 0002:0022, par 0003:0012 ou encore par 0004:0002
    Cela voudrait dire que même si on se place à un adresse de segment spécifique, on peut accéder à un octet d'un autre segment ? Ici par exemple, 0004:0002 est le 2e octet du 4e segment qu'on peut accéder à partir du 1er segment 0001:0032.

    Ensuite cet exemple se base sur des segments de 10h octets mais en réalité les segments peuvent avoir des tailles différentes et variables ?

  2. #2
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    il existe deux types de segmentations sur les X86.

    celle dont tu parles est la segmentation en mode reel, elle couvre 1Moctets d'espace d'adressage, coupé en paragraphes de 16 octets.

    l'adresse lineaire d'un octet est unique.
    l'adresse segmentée en mode reel multiplie le registre de segment par 16, et additionne l'offset 16 bits pour obtenir une adresse lineaire sur 20 bits.

    donc, on voit bien par cette equation:
    lin=seg*16+off
    qu'il est possible d'avoir plusieurs adresses segmentées pour une seule et unique adresse lineaire.

    par exemple:
    seg=200h
    off=1000h

    donne la meme chose que
    seg=100h
    off=2000h

    100h:2000h = 200h:1000h = 180h:1800h = 3000h lineaire

    et nous en resterons là pour le moment, le mode protegé sera pour plus tard.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    J'ai relu le tuto et ce que vous avez écris. Et je comprends à présent l'équation qu'on a. Mais cela suppose que les segments ne font que 16 octets vu qu'on multiplie par 16 en mode réel ? Et est-ce qu'un paragraphe est la même chose qu'un segment puisqu'il fait 16 octets aussi ?

  4. #4
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    en adressage mode réel 16 bits:

    un paragraphe de 16 octets sépare deux segments consécutifs.
    ce qui permet d'accéder à la même donnée depuis plusieurs segments.

    puis pour accéder à la mémoire, il faut additionner un offset sur 16 bits à ce segment.
    ce qui permet d'accéder 65536 octets sans changer de segment.

    la limite d'un segment est donc de 64k, l'espace entre deux segments de 16 octets.

    mais je crois qu'un petit dessin vaut un long discours:


  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    Par défaut
    Bon si je résume :
    un segment est un bloc dont la taille est variable et peut aller jusqu'à 64 ko.
    Les paragraphes sont des blocs de 16 octets qui séparent 2 segments consécutifs.
    En ajoutant l'offset à l'adresse du segment, on obtient l'adresse effective de l'octet sur 20 bits.

    Je ne comprends toujours pas pourquoi est-ce qu'on multiplie par 16 ? Pour moi cela suppose que chaque segment a une taille de 16 et le fait de multiplier le numéro du segment par 16 donne l'adresse en octet du segment depuis le début 0000:0000

    Ensuite je ne comprends pas pourquoi les paragraphes se placent entre 2 segments ? A quoi sert-il ? Ne devrait-on prendre en compte aussi sa taille dans le calcul d'une adresse effective en ajoutant un multiple de 16 octets ?

Discussions similaires

  1. [SuSE] questions sur la gestion mémoire
    Par jhfra dans le forum Linux
    Réponses: 2
    Dernier message: 02/12/2013, 11h39
  2. Questions sur les segments
    Par linux user dans le forum Administration
    Réponses: 3
    Dernier message: 09/09/2013, 14h56
  3. question sur l'espace mémoire
    Par Topeur dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 28/02/2008, 08h59
  4. Question sur la gestion mémoire
    Par rem02 dans le forum Langage
    Réponses: 7
    Dernier message: 06/01/2007, 22h06

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