Question

J'ai décidé de m'enseigner le langage d'assemblage.

J'ai réalisé que mon programme ne serait pas compilé si j'essayais de modifier la valeur d'un registre de segment.

Chaque article que j'ai trouvé indique que je peux effectivement changer la valeur d'au moins 4 registres de segments, alors que donne-t-il?

Je ne suis vraiment intéressé que par la raison pour laquelle, à ce stade, je n'ai pas vraiment de raison de changer ces adresses.

Était-ce utile?

La solution

Vous avez dit que vous vouliez savoir pourquoi, alors:

En mode réel, un segment est une "fenêtre" de 64 Ko. à la mémoire physique et ces fenêtres sont espacées de 16 octets. En mode protégé, un segment est une fenêtre sur la mémoire physique ou virtuelle, dont la taille et l'emplacement sont déterminés par le système d'exploitation. Il possède de nombreuses autres propriétés, notamment le niveau de privilège qu'un processus doit avoir pour y accéder.

À partir de là, tout ce que je dis se réfère au mode protégé.

Il existe dans la mémoire une table appelée GDT (Global Descriptor Table), où sont conservées les informations relatives à ces tailles et emplacements de fenêtre et à d'autres propriétés. Il peut également y avoir des tables de descripteurs locaux processus par processus et leur fonctionnement est similaire. Je me concentrerai donc uniquement sur le GDT.

La valeur que vous chargez dans un registre de segment est appelée sélecteur de segment . C'est un index dans le GDT ou le LDT, avec quelques informations de sécurité supplémentaires. Naturellement, si un programme tente de charger un descripteur situé en dehors des limites du GDT, une exception se produit. De même, si le processus ne dispose pas de privilèges suffisants pour accéder au segment ou si un autre élément n'est pas valide, une exception se produit.

Quand une exception se produit, le noyau la gère. Ce type d'exception serait probablement classé comme une erreur de segmentation. Donc, le système d'exploitation tue votre programme.

Un dernier avertissement: dans le jeu d'instructions x86, vous ne pouvez pas charger de valeurs immédiates dans des registres de segments. Vous devez utiliser un registre intermédiaire ou un opérande de mémoire ou POP dans le registre de segment.

MOV DS, 160  ;INVALID - won't assemble

MOV AX, 160  ;VALID - assembles, but will probably result in an
MOV DS, AX   ;exception, and thus the death of your program

Je pense qu’il faut souligner que l’architecture permet des tas de segments. Toutefois, autant que je sache, en ce qui concerne les systèmes d’exploitation x86 classiques, les registres de segments ne servent qu’à quelques fins:

  • Mécanismes de sécurité, tels que ceux empêchant les processus de l'espace utilisateur de se nuire les uns aux autres ou au système d'exploitation
  • Gestion des processeurs multiples / multicœurs
  • Stockage local en unités de thread: à titre d’optimisation, certains systèmes d’exploitation (y compris Linux et Windows) utilisent des registres de segments pour l’enregistrement TLS (thread-local storage). Étant donné que les threads partagent le même espace adresse, il est difficile pour un thread de "savoir". où sa région TLS est sans utiliser un appel système ou gaspiller un registre ... mais puisque les registres de segments sont pratiquement inutiles, il n'y a pas de mal à "gaspiller" eux pour le plaisir de TLS rapide. Notez que lors de la configuration, un système d'exploitation peut ignorer les registres de segments et écrire directement dans des registres de cache de descripteurs, qui sont "masqués". Les registres utilisés pour mettre en cache les recherches GDT / LDT déclenchées par des références aux registres de segments. Dans ce cas, si vous essayez de lire à partir des registres de segments, vous ne le verrez pas.

Hormis un segment par thread pour TLS, seul un petit nombre de segments (nombre de processeurs) sont utilisés, et uniquement par le système d'exploitation. Les programmes d’application peuvent complètement ignorer les registres de segments.

Cela est dû à la conception du système d'exploitation, pas à des limitations techniques. Il se peut que certains systèmes d’exploitation embarqués nécessitent des programmes d’espace utilisateur pour fonctionner avec les registres de segments, bien que je n’en connaisse aucun.

Autres conseils

Vous écrivez des exécutables Windows?

En mode protégé (Win32), les registres de segments ne sont plus utilisés.

Référence :

  

Le modèle de mémoire est également radicalement   différent de l'ancien temps de la   Monde 16 bits. Sous Win32, nous n’avons pas besoin   être préoccupé par le modèle de mémoire ou   segment plus! Il n'y en a qu'un   modèle de mémoire: modèle de mémoire à plat.   Il n'y a plus de segments de 64 Ko. le   la mémoire est un grand espace continu de   4 GO. Cela signifie également que vous n'avez pas   jouer avec des registres de segments. Vous   peut utiliser n'importe quel registre de segment pour   adresser n'importe quel point dans l'espace mémoire.   C'est une aide précieuse pour les programmeurs.   C'est ce qui rend l'assemblage Win32   programmer aussi facilement que C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top