Was genau bedeutet es, wenn jemand "Memory-Mapping", "IO Mapping", "Memory Mapped IO" & "Port Mapped IO" sagt?

All diese Wörter werden für mich ein wenig verwirrend, da ich ein Neuling bin. Ich verstehe, dass ein Mikrocontroller im Grunde ein Prozessor + Speicher zum Speichern von Daten (RAM) + Datenspeicher ist ODER von wo aus die Anweisungen ausgeführt werden (ROM / Flash) + Peripheriegeräte.

  1. Wie soll ich das Mapping visualisieren?
  2. Wird das Mapping auf dem RAM durchgeführt?
  3. Wenn ja, ist es nicht die Erinnerung selbst? Woher weiß der Verarbeiter davon?
  4. Wird diese Zuordnung durchgeführt, wenn ich den Controller einschalte, oder wird sie von der Person/Firma durchgeführt, die den Controller hergestellt hat?

Wenn es wirklich eine dumme Frage oder eine breite ist, lassen Sie es mich wissen. Ich würde versuchen, mich einzugrenzen.

Sie verwechseln den Speicheradressraum mit dem Speicher selbst.
Welche Art von Literatur oder Lehrbüchern zur Computerarchitektur haben Sie verdaut, bevor Sie diese Frage gestellt haben?
Bei Terminologiefragen oder Fragen wie "Was ist das?" beziehen Sie sich immer zuerst auf Wikipedia, z . B. en.wikipedia.org/wiki/Memory-mapped_I/O . Früher wurden die meisten Aspekte der Frage abgedeckt. Wenn dann etwas unklar ist oder Sie ein echtes Problem haben, stellen Sie eine Frage zu dem Problem oder diesem sehr spezifischen Aspekt. Auf diese Weise sparen Sie Zeit und erhalten Informationen strukturierter.
@IgnacioVazquez-Abrams schwöre, ich habe es getan
@AliChen 8085 Architekturbücher und einige Antworten auf dieser Seite, die mich verwirrt haben. Ich hatte wirklich Probleme zu verstehen, wie die Festplatten des PCs das Betriebssystem / ausführbare Programme in den Arbeitsspeicher legen. Ich dachte, die Speicheradresse der Festplatte wird auf das RAM abgebildet
Ein Laufwerk (Festplatte, Diskette oder optisch) ist ein E/A-Gerät – es verfügt über einige Steuer- und Datenregister, die einige Speicher- oder E/A-Stellen belegen. Das Programm gibt Befehle an den Disc-Controller aus, wie "Gib mir einen Datenblock, der bei Spur X, Sektor Y beginnt", und der Disc-Controller liest diese Daten von der Disc und legt sie in einem Datenregister ab, wo das Programm sie sehen kann . Sie können ein Programm nicht direkt von der Disc ausführen.
"Wie die Festplatten des PCs das Betriebssystem/ausführbare Programme in den Arbeitsspeicher legen" - das ist eine andere Frage. Festplatten haben normalerweise eine viel größere Speicherkapazität als RAM, sodass sie nicht direkt dem direkten Speicherplatz zugeordnet werden können. Nur einige kleine Teile (Programme) können übertragen und zur Ausführung in den RAM GELADEN werden.

Antworten (4)

Ich denke, diese Begriffe werden hauptsächlich mit Mikroprozessoren und nicht mit Mikrocontrollern verwendet.

"Speicherabgebildete" E/A-Geräte erscheinen einfach als normale Speicherstellen und können von allen Befehlen gelesen oder geschrieben werden, die normale Datenspeicher lesen oder schreiben können. Memory-mapped I/O kann von jedem Mikroprozessor verwendet werden.

Einige Mikroprozessoren (Intel 8085 und Verwandte) haben einen separaten Adressraum für die Verwendung von E/A-Geräten, der nicht Teil des normalen Speicherraums ist, und eine begrenzte Anzahl von Anweisungen zum Lesen oder Schreiben in diesen Adressraum. E/A-Geräte, die diesen Raum verwenden, wären "IO Mapped".

Interessant. Und wie definieren Sie den Unterschied in der Zuordnung zwischen "einem Mikrocontroller" und "einem Mikroprozessor"? Anders als im ersten Fall wird das Mapping häufig vom IC-Hersteller vordefiniert (festgelegt), während im zweiten Fall das Mapping vom Systemdesigner selbst gewählt werden muss? IMO, das Konzept des Mappings ist dasselbe.
Bei einem Mikrocontroller sind die Adress- und Datenbusse normalerweise nicht extern verfügbar, sodass der Benutzer keine andere Wahl hat, als auf die I/O-Ports zuzugreifen, wie es der Hersteller vorsieht, sodass es nicht viel Sinn macht, bei Mikrocontrollern über I/O-Zugriffsmodi zu sprechen . Bei Mikroprozessoren sind die Adress- und Datenbusse sowie die erforderlichen Steuerleitungen für den Benutzer zugänglich, sodass er wählen kann, wie E / A implementiert werden sollen (aber einige Mikrocontroller haben keinen spezifischen E / A-Platz und keine Anweisungen, sodass Sie nicht weiterkommen mit speicherabgebildeter E/A).

Niemand scheint dies direkt gesagt zu haben, also werde ich es tun; Dies bedeutet im Grunde, dass die beiden Mapping-Typen unterschiedliche Steuerleitungen haben. Betrachten Sie die sehr beliebte (zumindest von mir, heh) Z80-Architektur, die separate E / A und Speicher hat.

Beide Abbildungsarten verwenden denselben Adress- (16 Leitungen) und Datenbus (8 Leitungen). Um der externen Logik mitzuteilen, ob Sie Speicher oder IO adressieren, hat der Prozessor zwei Pins; einer heißt MREQ und der andere IORQ. Wenn der Prozessor MREQ auf Low zieht, ist die externe Logik konfiguriert, um zu erkennen, dass dies eine Speicheradresse auf dem Adressbus ist, und verbindet den Speicher mit dem Datenbus, nachdem der Adressbus dekodiert wurde, um Daten zu lesen oder zu schreiben (die von der RD gesteuert werden (Lesen) und WR (Schreiben) Pins, von denen einer für den Lese- oder Schreibvorgang niedrig wird.

Wenn der Prozessor IORQ auf Low zieht, erkennt Ihre externe Logik dies als eine IO-Anforderung und verbindet ein externes Gerät mit dem Datenbus, nachdem sie den Adressbus decodiert hat. Die Erinnerung bleibt unverbunden. In der Praxis führen die meisten Speicherchips die Adressdecodierung und das Verbinden/Trennen unter Verwendung einer internen Steuerlogik durch.

Wenn der Prozessor sowohl MREQ als auch IORQ gleichzeitig auf Low zieht, ist er kaputt. Wirf es weg. Was es nach unten zieht, hängt von bestimmten Anweisungen in dem vom Programmierer verwendeten Anweisungssatz ab.

Es hängt also alles davon ab, ob es Steuerleitungen auf dem Prozessor gibt, um mehr als einen Modus für die Busse zu unterscheiden. Der Vorteil besteht darin, dass Sie den gesamten Adressraum für den Speicher verwenden können und dennoch eine Möglichkeit haben, eine Verbindung zu externen Geräten herzustellen, die viele Adressorte für eine einfache Schnittstelle verwenden können, da möglicherweise 64k davon verfügbar sind (mit einem 16-Bit Bus).

Eine merkwürdige Kuriosität beim Z80 ist, dass seine Spezifikation behauptet, dass er nur 8 Bits des Adressbusses für IO verwendet, gesteuert durch das C-Register, aber tatsächlich alle 16 codiert, indem er das Paar BC (in den In- und Out-Befehlen) verwendet. Was nett ist.

Das Mapping erfolgt im Allgemeinen mit dedizierter Hardware in Silizium, normalerweise unter der Schirmherrschaft der CPU. Schauen wir uns Ihre vier Sätze ganz schnell an:

  • Memory-Mapping
  • IO-Mapping
  • Speicherzugeordnetes IO
  • Port-zugeordnetes IO

Mein Bauchgefühl sagt, dass Ihre Verwendung von Memory-Mapping und IO-Mapping von den doppelten Speicherbereichen eines x86-basierten Systems herrührt – den 64 KB IO-Speicherplatz, der im Wesentlichen veraltet ist, und dann dem viel größeren Speicherbereich, der meiner Meinung nach reicht die Exabyte jetzt mit 64-Bit-Rechnern.

BEARBEITEN: Ich werde diesen Absatz zu meiner Antwort hinzufügen und vermute, dass Ihre Frage eher auf Mikrocontroller (PIC, AVR usw.) ausgerichtet ist. Ich habe das ein wenig angesprochen, um Ihre Frage Nummer vier zu beantworten. Die Zuordnung / Adressen hier werden im Wesentlichen von den Chiparchitekten festgelegt, und im Allgemeinen gibt es eine Adressdecoder- / Speicherverwaltungseinheit (nicht im strengen MMU-Sinne), die Daten an die richtige Stelle auf dem internen Bus sendet. Das heißt, wenn Sie in ein UART-Steuerregister schreiben, wirkt sich dies auf die Flipflops aus, die physikalisch für diese Bits verantwortlich sind. Wenn Sie von einer SRAM-Adresse lesen, werden die Daten direkt von dieser zurückgegeben.

In beiden Fällen ist das Mapping die gleiche allgemeine Aufgabe - nehmen Sie eine bestimmte Adresse und geben Sie ihr eine besondere Bedeutung / leiten Sie sie irgendwohin. Beispielsweise zeigt auf einer x86-Plattform die I/O-Space-Adresse 0x3F8 auf das Register für den seriellen Port des Systems. Wenn Sie an diese Adresse schreiben oder von ihr lesen (outb()/inb()), ändern Sie physisch den Zustand von 8 Bits (wahrscheinlich als SRAM oder Flip-Flops implementiert), die Daten an diesem seriellen Anschluss enthalten.

Ebenso können Sie für speicherabgebildete E/A ein PCI-Gerät haben, das eine gewisse Menge an Speicher anfordert. Ich könnte ein Gerät entwerfen, bei dem, wenn Sie ein Byte an eine bestimmte Adresse schreiben, das den Zustand von 8 LEDs ändert - 0x00, alle aus, 0xFF, alle an. Ihre MMU (Memory Management Unit) ist dafür verantwortlich zu erkennen, dass die von Ihnen geschriebene Speicheradresse für etwas auf dem PCI-Bus bestimmt ist.

Ich werde hier nicht in den virtuellen Speicher eintauchen - in modernen Betriebssystemen ist es im Allgemeinen nur Kernelcode / privilegierter Code, der die Möglichkeit hat, direkt von physischen Speicheradressen zu lesen/schreiben. Es sind Infrastruktur-/Abstraktionsschichten eingebaut, um diesen Zugriff für Benutzeranwendungen zu steuern. Sie könnten zum Beispiel Seitentabellen nachlesen.

Also zurück zu deinen Fragen -

1) Wie soll ich das Mapping visualisieren?

Nur das – eine Kartierung. Es ist eine Karte, die Ihnen sagt, wie Sie von Ihrem Start (einer Adresse, sagen wir 0xE0000000) zum Ziel (vielleicht ein PCI-Gerät, vielleicht ein bestimmter Ort im physischen RAM) gelangen.

2) Wird das Mapping auf dem RAM durchgeführt?

Nein. Physischer RAM – beispielsweise auf der untersten Ebene ein einzelner Kondensator, der ein einzelnes Bit im DRAM darstellt – ist eines der vielen Ziele, die ebenfalls abgebildet werden könnten. Nicht jede einzelne Speicheradresse entspricht notwendigerweise einem physikalischen Bit, das irgendwo gespeichert ist.

Wenn Sie einen Prozessor haben, der über einen externen Adress-/Datenbus (oder einen anderen großen parallelen Bus) verfügt, werden Lese-/Schreibvorgänge direkt auf dieser Schnittstelle in Verkehr übersetzt – die meisten Leute verwenden heutzutage SPI/I2C/andere serielle Protokolle , aber es war nicht ungewöhnlich, große eingebettete Systeme zu haben, bei denen parallele SRAMs über eine parallele 8- oder 16-Bit-Schnittstelle (AD0-AD15) angeschlossen wurden.

3) Wenn ja, ist es nicht die Erinnerung selbst? Woher weiß der Verarbeiter davon?

Auf x86-Systemen wird der größte Teil der Low-Level-Verwaltung der Systemspeicherzuordnung, die mehr als 20 Jahre alt ist, von Ihrer BIOS-Firmware und anschließend von der Betriebssysteminitialisierung durchgeführt.

4) Wird diese Zuordnung durchgeführt, wenn ich den Controller einschalte, oder wird sie von der Person/Firma durchgeführt, die den Controller hergestellt hat?

Es gibt feste Zuordnungen in Silizium (sehr zutreffend für eingebettete Mikrocontroller), wo Sie das Datenblatt lesen und feste Adressen für Steuerregister, Peripheriegeräte usw. erhalten können. Die Architekten des Chips haben eine Speicherzuordnung entworfen, die für sie sinnvoll ist, und verlässt sie normalerweise Vorkehrungen für verschiedene Modelle mit unterschiedlichen Peripheriegeräten / Speichermengen (dh ein 32-KB- und ein 64-KB-Modell desselben Chips können alle Register / Peripheriegeräte an denselben Stellen haben, und nur die Speicheradresse für den RAM ist unterschiedlich).

Bei anspruchsvolleren Systemen, bei denen sich Dinge bewegen können (wie PCI-Plug-and-Play), ist die Speicheradresszuweisung dynamisch und wird von Software ausgeführt.

Das scheint ziemlich auf den Punkt zu kommen

Dies ist eine interessante Übung. Lassen Sie mich meine Variante anbieten.

1) Wie soll ich das Mapping visualisieren? - wie eine Straßenkarte mit Speichereinheiten (der Speicher speichert Daten!), wobei jede Einheit eine eindeutige Straßenadresse hat. Der Speicher kann in "Seiten" organisiert werden. Das ist wie die gleiche Straßenkarte mit gleichem Adressbereich, nur in einer anderen Stadt mit anderer Postleitzahl (Seitenwähler).

2) Wird das Mapping auf dem RAM durchgeführt? - Ich bin mir nicht sicher, was Sie mit "im RAM" meinen, aber die Zuordnung erfolgt über eine spezielle Logikeinheit namens "Adressdecoder". Es ist wie ein Postamt. Die CPU wirft eine Zahl (Speicheradresse) und der Decoder "öffnet" die entsprechende "Speichereinheit". Die CPU kann dann einige Daten speichern oder gespeicherte Daten abrufen.

3) Wenn ja, ist es nicht die Erinnerung selbst? - nein, siehe (2) oben. Jemand ("Adressdecoder") muss sich die Nummer (angeforderte Adresse) ansehen, die Karte nachschlagen und den richtigen Speicherort ("Tür") für einen Lese-/Schreibvorgang öffnen.

3a) Woher weiß der Auftragsverarbeiter davon? - Es tut nicht. Der Speichercontroller liefert nur die Daten gemäß der "Karte". Aber der Softwareprogrammierer muss wissen, welcher Bereich abgebildet wird und welche "Speichereinheit" zu verwenden ist.

4) Wird diese Zuordnung durchgeführt, wenn ich den Controller einschalte, oder wird sie von der Person/Firma durchgeführt, die den Controller hergestellt hat? - es hängt davon ab, ob. Bei kleineren Mikrocontrollern ist die Karte in der Hardware fest codiert. Größere Prozessoren mit vom Benutzer installierbarem Speicher (wie DIMMs in PCs) müssen während der Initialisierung durch das BIOS Besonderheiten der installierten Speicher ermitteln und den Speichercontroller konfigurieren (Adressdecoderbereiche und andere Parameter wie Zugriffszeit usw. einstellen).

Bitte beachten Sie, dass Erinnerungen normalerweise als interne Speichereinheiten gedacht sind und normalerweise nicht der externen (peripheren) Welt ausgesetzt sind. Die Peripheriegeräte interagieren mit Prozessorinterna über einige dedizierte I/O-Register oder GPIO – Allzweck-Eingabe-Ausgabe-Register. Bei einigen Prozessorarchitekturen sind diese GPIOs in derselben Adresskarte abgebildet, in einer separaten entfernten "Unterteilung". Einige Architekturen haben einen dedizierten E/A-Raum und haben dedizierte E/A-Befehle. Die Auswahl verschiedener GPIOs folgt der gleichen Idee - Adressdecoder wählt vordefinierte "Türen" aus.

Es gibt andere Räume, wie "Konfigurationsraum", die einen speziellen eingeschränkten Zugriffsmodus haben können. Es kann auch in den Speicheradressraum abgebildet werden.