2017-12-22 3 views

Antwort

2

Der in 8086 verwendete Befehlssatz ist ein 16-Bit-Befehlssatz. Dies bedeutet, dass ein Register nur Werte im Bereich von 0x0000 bis 0xFFFF speichern kann, und Befehle meist nur 16-Bit-Operationen (16-Bit-Addition, 16-Bit-Subtraktion usw.). Wenn ein Register eine Adresse/einen Zeiger enthält, hätte es bis zu 64 KiB Adressraum (einige für ROMs, einige für RAM) ausgearbeitet, und das war damals für den Markt nicht genug.

Die Segmentierung ermöglichte der 16-Bit-CPU die Unterstützung eines größeren Adressraums. Im Wesentlichen kombiniert zwei 16-Bit-Register zusammen, so dass Adressen/Zeiger viel größer sein könnten. Leider (um "unnötige Kosten" zu vermeiden, mehr Adressleitungen auf dem CPU-Bus zu haben), hat Intel statt zwei 16-Bit-Registern als 32-Bit-Adresse eine "Adresse = Segment * 16 + Offset" verwendet "Sache mit einer 20-Bit-Adresse, die 8086 einen 1 MiB Adressraum geben.

Später (Anfang der 1980er Jahre) gab es einen Drang in Richtung "geschützte Objekte", wo "Objekte" (in objektorientierter Programmierung) Zugriffssteuerungen und Beschränkungen, die durch Hardware erzwungen/überprüft wurden, gegeben wurden "virtual memory" Ideen, die herumschweben. Diese Ideen führten zu der unglücklichen iAPX 432 CPU; führte aber auch zu der Idee, den Segmenten, die 8086 bereits hatte, Schutz (Attribute und Grenzen) zuzuordnen, was zu dem mit 80286 eingeführten (und in 80386 erweiterten) "protected mode" führte.

Im Wesentlichen; der ursprüngliche Grund für (Vorteil von) Segmente war, den Adressraum zu vergrößern (ohne die Kosten eines 32-Bit-Befehlssatzes usw.); und Dinge wie Schutz und Speicherverwaltung wurden nachträglich angepasst (und dann kaum von Software verwendet, bevor sie zugunsten von Paging aufgegeben wurden).