6
votes

Comment les segments de mode réel x86 se chevauchent-ils d'aide à l'économie de mémoire?

J'enseigne mes 12 ans 8086 Langue de montage et hier, nous parlions de la mémoire, de l'adressage et de la segmentation. Je lui ai montré comment les segments peuvent être visualisés en tant que séquence de blocs de 64 Ko se chevauchant sur des limites de 16 octets, avec le décalage étant un pointeur de style 8080 dans un segment. Puis il a posé une question que je ne pouvais pas répondre: Pourquoi (quoi pour, avec quel but) se chevauchent-ils ?

Essayer de rechercher cette question J'ai trouvé de nombreuses copies des mathématiques 20 bits et quelques-uns vagues mention de certains Économies de mémoire Ce schéma permet considérablement . Quelqu'un peut-il élaborer une partie de la mémoire? Ou d'autres moyens de prendre des avantages pratiques des chevauchements?


4 commentaires

La mémoire segmentée n'est pas amusante pour travailler avec peu importe quel âge vous êtes ;-) Si j'étais l'enseignant, je serais passé directement au modèle de mémoire plate 32 bits. Ou un processeur 8 bits comme Z80.


@Villekrumlinde Ouais, nous avons commencé à partir de 8080 qui n'avaient pas de problèmes si stupides. Chaque fois que j'étudie ou j'enseigne, j'aime toujours souligner le point de vue historique, d'où mon hésitation à sauter sur les bizarreries.


@Villekrumlinde: La conception du segment de mode réel 8086 est imhotale considérablement sous-estimée, en grande partie parce que c manque les installations pour en tirer le meilleur parti. Si C fournit un moyen de déclarer des pointeurs dont la partie décalée était garantie de zéro et avait des méthodes d'allocation qui ont renvoyé de tels pointeurs, le génie de la segmentation en mode réel aurait été beaucoup plus apparent.


Related: Quels sont les segments et comment peuvent-ils être adressés en mode 8086? discute de laisser des segments chevauchent ou non


3 Réponses :


2
votes

Supposons que vous possédez un service de stationnement de voiturier dans une longue allée étroite, de sorte que les véhicules sont tous égarés de style parallèle parallèle. Certains de vos clients conduisent des voitures et n'utilisent que 1 espace. D'autres conduisent des limoustures étirées et nécessitent 2 espaces. Une voie de stationnement Les véhicules seraient d'attribuer 2 espaces à chaque véhicule, quelle que soit leur taille. Vos billets de réclamation diraient que "le véhicule est garé à partir de l'espace 0 (taille maximale du véhicule est de 2 espaces)" ou "Démarrer dans l'espace 2" ou "Démarrer dans l'espace 4", etc.

Cela fonctionnerait, mais il gaspille des espaces car vous réservez 2 espaces pour les voitures qui n'ont besoin que de 1. Ainsi, vous emballez les véhicules ensemble, avec des voitures qui ne prennent qu'un espace et des limousines en prenant deux. Vos employés savent que la voiture ne prend qu'un espace. Donc, si un billet indique "Démarrer dans l'espace 1 (la taille maximale du véhicule est de 2 espaces)" Ils savent que "la voiture est dans l'espace 1 et l'espace 2 appartient à quelqu'un d'autre." L'espace de la voiture 2 chevauche effectivement la limousine garée dans les espaces 2 et 3, mais ce serait une mauvaise idée de l'utiliser ou que vous allez dent la limousine.


1 commentaires

Merci pour l'analogie! Je suppose que je pourrais utiliser des bus, des camions et d'autres véhicules varisés.



6
votes

Le chevauchement moins élevé, moins vous aurez le choix où un segment commence dans la mémoire physique. Cela crée des lacunes entre les segments qui ne sont pas utiles, gaspillant ainsi la mémoire. Le choix de conception ne crée jamais une lacune supérieure à 15 octets. Cela dépend un peu peut-être que 8086 a été conçu à une époque où 1 mégaoctet suffisait pour tout le monde. Et l'achat de 64 kilo-octets mettait un dent assez important dans votre budget. Assez précieux pour ne pas vouloir perdre des lacunes.


0 commentaires

3
votes

Les économies de mémoire sont entièrement la mauvaise façon de le regarder imo. Ce processeur est sorti à la fois lorsque l'espace d'adressage de 16 bits devait vraiment serré. D'autres processeurs d'espace d'adresses de 16 bits ont eu des méthodes de commutation bancaire après le fait. Un espace d'adresses 20 bits était une approbation importante (24 ou 32 bits n'était que des discussions folles à l'époque). Plutôt que de piquer sur une commutation de banque externe (qui est une douleur au programme), ils ont utilisé des registres. Eh bien, devinez quoi, le processeur est de 16 bits en interne, alors pourrait aussi utiliser des registres 16 bits. Maintenant, obtenez 20 bits d'une paire de registres de 16 bits constitue un problème intéressant. Utilisation du segment comme alignement du paragraphe Fondamentalement vous donne la gamme complète (plus un peu de dépassement, mais c'est un problème totalement différent) de la manière la plus flexible (rappelez-vous la douleur de la bourse que j'ai mentionnée? C'est principalement à cause de ne pas pouvoir le faire de manière fines).


3 commentaires

C'est la partie 20 bits de l'histoire. Il répond à la question «Quelles contraintes ont conduit à cette décision de conception». Je pose une question différente: "Quels sont les avantages de cette décision de conception au-delà de la satisfaction des contraintes".


Je pensais que je me suis couvert aussi. Pour la mettre plus simplement, le seul avantage réel est que vous pouvez générer des images de sortie à code unique non-relocatables d'être réellement remboursables (sans liaison / fixe) en ne permettant pas la manipulation du registre de segment pour le segment de code. Aka le format ".com" exécutable dans DOS.


@Brianknoblauch: dans le code contraint des ressources, être en mesure d'identifier tout bloc de mémoire aligné par paragraphe avec une valeur à deux octets peut être plus utile que de devoir utiliser trois ou quatre octets à cet effet. Dans le code de l'assemblage, si on a besoin de pointeurs sur de nombreux objets, être capable d'utiliser deux octets par pointeur au lieu de quatre peuvent facilement compenser la mémoire gaspillée entre l'arrondi de taille d'objet. TOW BAD C n'a pas de type pointeur "segment-seulement" de deux octets.