Warum 4 "Null" -Bits (0000) am Ende der Segmentregisteradresse hinzufügen, um die Segmentadresse im physischen Speicher zu erhalten?

558
parvin

Warum müssen wir eine Adresse im Speicher finden, in der 20 Bits freier Speicherplatz vorhanden sind, die 16 Bits für das Segmentregister und 4 "Null" -Bits haben?

Wenn beispielsweise das CS-Register 346AH ist, ist das Codesegment im Hauptspeicher 346A0H, also 20 Bit. Warum machen wir das?

Speichersegmente sind 64 KByte (?). Was passiert mit dem restlichen Speicherplatz, aus diesen 20 Bits?

Sorry, ich bin nicht sehr gut in der Computerarchitektur!

1
Wie lang ist also ein Segment, beispielsweise ein Codesegment im Hauptspeicher? parvin vor 6 Jahren 0
"Aus Gründen der Abwärtskompatibilität starten alle x86-CPUs im" Real-Modus "ohne Speicherschutz, feste 64-KiB-Segmente und nur 20-Bit-Adressierung (1024 KiB). Ein Prozessor mit 80286 oder höher muss per Software in einen anderen Modus geschaltet werden um den vollen Adressraum und die erweiterten MMU-Funktionen zu nutzen. " Ramhound vor 6 Jahren 0
Kommt auf das verwendete Register an. "Vier der Segmentregister: CS, SS, DS und ES werden auf 0 und die Grenze auf 264 gezwungen. Die Segmentregister FS und GS können immer noch eine Basisadresse ungleich Null haben." [Speichersegmentierung] (https://en.wikipedia.org/wiki/Memory_segmentation) Ramhound vor 6 Jahren 0
Es steht in meinem Buch, dass sie maximal 64 KB groß sind, und mein Buch ist auf Persisch, daher ist es nicht nützlich, wenn Sie den Namen nennen! parvin vor 6 Jahren 0
Ich muss den Namen Ihres Buches nicht kennen, um zu wissen, dass die Informationen datiert sind. Ramhound vor 6 Jahren 0
Anscheinend beziehen Sie sich auf die ** x86 ** -Segmentierung, wie sie ursprünglich in den Intel 8086/88-CPUs verwendet wurde. Diese Art von "Segment" * ist nicht universell. Das x86-Segment ist eine * verkürzte * Adresse von nur 16 Adressbits. Daher müssen die vier abgeschnittenen Nullbits angehängt werden, um den tatsächlichen Start des x86-Segments im 20-Bit-Speicherplatz zu erhalten. sawdust vor 6 Jahren 0
@Ramhound, was meinst du mit 20-Bit-Adressierung? parvin vor 6 Jahren 0
@parvin - Ihre Frage bezieht sich speziell auf die 20-Bit-Adressierung. Ich habe einen Wikipedia-Artikel aus Gründen der Bequemlichkeit zitiert, um die Tatsache hervorzuheben, dass Sie von einem "echten Modus" und nicht von einem "geschützten Modus" (https://en.wikipedia.org/wiki/Protected_mode#Segment_addressing) sprechen, der [MMU] (https) hat : //en.wikipedia.org/wiki/X86_virtualization#I.2FO_MMU_virtualization_.28AMD-Vi_and_Intel_VT-d.29) Ramhound vor 6 Jahren 0
@sawdust aha, und was meinst du mit "tatsächlicher Start" des Segments? parvin vor 6 Jahren 0
@parvin - Er meint einen Offset. 16 Bits wären 0x346A Ramhound vor 6 Jahren 0
* "Was meinen Sie mit" tatsächlicher Start "des Segments? * - Das erste Byte des x86-Segments. Ein x86-Segment kann bis zu 64 KB groß sein. Sie müssen eine (abgeschnittene 16-Bit) Segmentadresse mit einem (16-Bit) Offset kombinieren, um eine 20-Bit-Adresse zu generieren. Die x86-Segmentadresse muss jedoch mit 16 multipliziert werden (aka vier Null-Bits anhängen), bevor Sie den Versatz hinzufügen können. Ein Offset von Null ist der Anfang des x86-Segments. sawdust vor 6 Jahren 0
@sawdust Warum ist der Anfang eines Segments 20 Bit? parvin vor 6 Jahren 0
Was hat das mit dem 'segmentation-fault'-Tag zu tun? Barmar vor 6 Jahren 0

1 Antwort auf die Frage

2
sawdust

Wenn beispielsweise das CS-Register 346AH ist, ist das Codesegment im Hauptspeicher 346A0H, also 20 Bit. Warum machen wir das?

Anscheinend beziehen Sie sich auf die x86-Segmentierung, wie sie ursprünglich in den Intel 8086/88-CPUs verwendet wurde. Diese Art von "Segment" ist nicht universell. Es gibt andere Definitionen für Speicher " Segmente ".

In einem historischen Kontext müssen Sie feststellen, dass Silizium- und (Ferrit-) Speicher früher sehr teuer waren. Um den teuren Mainframe-Computern entgegenzuwirken, entwickelte sich der Minicomputer in den 70er Jahren, um einen kostengünstigen Computer bereitzustellen. Dieser Fokus auf niedrige Kosten bedeutete normalerweise einen 16-Bit-Adressbus (z. B. DEC PDP, Data General Nova, HP 21xx) und bis zu 64 KB Arbeitsspeicher. Mit den steigenden Systemanforderungen wurde jedoch häufig mehr Speicher benötigt.

Es wurden Speicherschemata entwickelt, die immer noch die vorhandenen 16-Bit-Adressen verwenden und auf mehr Speicher zugreifen können.
Die gebräuchlichste Technik zum Erweitern der 64-KB-Speicherkapazität um 16-Bit-Adressen bestand in der Verwendung von Speicherbänken, dh die tatsächlichen oberen Bits der effektiven Speicheradresse werden durch ein Bankregister angegeben. Der Hauptvorteil der Verwendung von Speicherbänken besteht darin, dass sie im Speichersubsystem (dh außerhalb der CPU) implementiert werden können und daher für jede CPU nachgerüstet werden können.
Mit dem Aufkommen von Mikroprozessoren entwickelten sich Systeme mit 16-Bit-Adressierung (z. B. Intel 8051, Zilog Z80) in ähnlicher Weise, dh sie besaßen Speicher mit Bankspeicher.

Die Segmentadressierung, wie sie von Intel x86 (und mindestens einem anderen System, das ich kenne) verwendet wird, ist in den Prozessor integriert und daher vielseitiger.
Während eine Speicherbank nur einen festen Bereich im ursprünglichen Speicherbereich belegen kann, bieten x86-Segmente Zugriff auf einen erweiterten 20-Bit-Adressraum unter Verwendung eines 16-Bit-Offsets in Kombination mit einer Spezifikation eines Segmentregisters.

Die x86-Segmentadresse ist tatsächlich eine 20-Bit-Adresse, die auf nur 16 Adressbits verkürzt ist.
Dieses Segment kann an einem beliebigen Absatz beginnen (die Adresse modulo 16 ist Null).
Daher müssen die vier abgeschnittenen Nullbits angehängt werden, um den tatsächlichen Start des x86-Segments im 20-Bit-Speicherplatz zu erhalten.
Abhängig vom x86-Speichermodell kann die x86-Software hauptsächlich 16-Bit-Adressen (wie ältere Software) verwenden, kann jedoch auf effektiveren Speicher zugreifen als die ältere 16-Bit-Adresssoftware.

IOW x86-Segmente waren eine Methode zum Erweitern der Hardware auf einen 20-Bit-Adressbus. Die Software kann jedoch hauptsächlich 16-Bit- "Adressen" verwenden und erfordert keine 20-Bit-Arithmetik (dh 20-Bit-Register und Daten).