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.
Wenn es wirklich eine dumme Frage oder eine breite ist, lassen Sie es mich wissen. Ich würde versuchen, mich einzugrenzen.
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".
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:
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.
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.
Ignacio Vazquez-Abrams
Ale..chenski
Anonym
ManyYack
ManyYack
Peter Bennett
Ale..chenski