Speicher-abgebildete I/O
Speicher-abgebildete I/O (Mmio) und portkartierende I/O (PMIO) sind zwei komplementäre Leistungsmethoden Input-Output (I/o) zwischen den Zentrale Verarbeitungseinheit (CPU) und Peripheriegeräte in einem Computer. Ein alternativer Ansatz ist die Verwendung dedizierter E/A -Prozessoren, die allgemein bekannt als Kanäle an Mainframe -Computer, die ihre eigenen ausführen Anweisungen.
Speichergemedelte I/O verwendet das gleiche Adressraum beides zu adressieren Haupterinnerung und E/A -Geräte. Die Erinnerung und Register der E/A -Geräte werden auf (verknüpfte) Adresswerte zugeordnet. Eine Speicheradresse kann sich also auf einen Teil von beziehen physischer Raidoder stattdessen in Speicher und Register des E/A -Geräts. Somit können die CPU -Anweisungen zum Zugriff auf den Speicher auch zum Zugriff auf Geräte verwendet werden. Jedes E/A -Gerät überwacht den Adressbus der CPU und reagiert auf einen beliebigen CPU -Zugriff auf eine Adresse, die diesem Gerät zugewiesen ist, wobei die Verbindung der Verbindung hergestellt wird Datenbus zu den gewünschten Geräten Hardwareregister. Um die E/A -Geräte aufzunehmen, müssen Bereiche der von der CPU verwendeten Adressen für die E/A reserviert werden und dürfen für den normalen physischen Speicher nicht verfügbar sein. Die Reservierung kann dauerhaft oder vorübergehend sein (wie durch erreicht Bankwechsel). Ein Beispiel für letztere findet sich in der Commodore 64, die eine Form der Speicherzuordnung verwendet, um zu verursachen RAM oder I/O -Hardware, um in der zu erscheinen 0xd000-0xdfff
Angebot.
Mit dem Port-Mapited E/A werden häufig eine spezielle Klasse von CPU-Anweisungen verwendet in
und aus
Anweisungen auf Mikroprozessoren basierend auf der x86 und x86-64 Architekturen. Verschiedene Formen dieser beiden Anweisungen können eine, zwei oder vier Bytes kopieren (Outb
, outw
und Aussicht
jeweils zwischen dem EAX Register oder eine der Unterteilungen dieses Registers in der CPU und einen angegebenen E/A -Port, der einem E/A -Gerät zugewiesen ist. E/A -Geräte haben einen separaten Adressraum aus dem allgemeinen Speicher, entweder durch eine zusätzliche "E/O" Bus Widmed I/O. Da der Adressraum für E/A von dem für das Hauptgedächtnis isoliert ist, wird dies manchmal als isoliertes E/A bezeichnet.[1]
Überblick
Unterschiedliche Kommunikationsmethoden für CPU-to-Device, wie z. B. Speicherzuordnung, wirken sich nicht auf die aus direkter Speicherzugriff (DMA) für ein Gerät, da DMA per Definition eine Kommunikationsmethode für Speicher-Gerät ist, die die CPU umgeht.
Hardware Interrupts sind eine weitere Kommunikationsmethode zwischen der CPU und peripheren Geräten, aber aus mehreren Gründen werden Interrupts immer getrennt behandelt. Ein Interrupt wird im Gegensatz zu den oben genannten Methoden, die CPU-initiiert sind, eingerichtet. Es ist auch unidirektional, da die Information nur von Gerät zu CPU fließt. Zuletzt trägt jede Interrupt -Linie nur eine bisschen von Informationen mit einer festen Bedeutung, nämlich "ein Ereignis, das in einem Gerät auf dieser Interrupt -Linie aufmerksam ist".
E/A -Vorgänge können den Speicherzugriff verlangsamen, wenn die Adresse und die Datenbusse gemeinsam genutzt werden. Dies liegt daran, dass das periphere Gerät normalerweise viel langsamer ist als der Hauptspeicher. In einigen Architekturen arbeitet die von der Port ampassende I/A über einen speziellen E/A-Bus, der das Problem lindert.
Ein Verdienst von Memory-Capted I/O ist, dass durch Ablehnen der zusätzlichen Komplexität, die Port-E/A mitbringt, eine CPU weniger interne Logik erfordert und somit billiger, schneller, leichter zu bauen ist, weniger Strom verbraucht und physisch kleiner sein kann. Dies folgt den grundlegenden Grundsätzen von Reduziertes Anweisungssatz Computingund ist auch vorteilhaft in eingebettete Systeme. Der andere Vorteil ist, dass für die Adressierung von Geräten regelmäßige Speicheranweisungen verwendet werden, und alle Adressierungsmodi der CPU für die E/A sowie für den Speicher sowie die Anweisungen, die eine ausführen Alu Operiert direkt in einem Speicheroperanden (Laden eines Operanden von einem Speicherort, das Speicher des Ergebniss an einem Speicherort oder beides) kann auch mit E/A -Geräteregistern verwendet werden. Im Gegensatz dazu sind E/A-Anweisungen von Port-Kartella oft sehr begrenzt und bieten häufig nur für einfache Last- und Geschäft Vorgänge zwischen CPU-Registern und E/A-Anschlüssen Das Geräteregister würde drei Anweisungen erfordern: Lesen Sie den Port zu einem CPU -Register, fügen Sie die Konstante zum CPU -Register hinzu und schreiben Sie das Ergebnis zurück in den Port.
Wie 16-Bit Prozessoren sind veraltet und ersetzt durch 32-Bit und 64-Bit Im Allgemeinen ist die Reserving -Bereiche des Speicheradressenraums für E/A weniger ein Problem, da der Speicheradressraum des Prozessors normalerweise viel größer ist als der erforderliche Speicherplatz für alle Speicher- und E/A -Geräte in einem System. Daher ist es häufiger praktisch geworden, die Vorteile von Memory-Capted I/O zu nutzen. Selbst wenn der Adressraum kein großes Problem mehr ist, ist weder die E/A-Mapping-Methode dem anderen allgemein überlegen, und es wird Fälle geben, in denen die Verwendung von I/A mit Port-einbereiteten E/A immer noch vorzuziehen ist.
Memachemitiertes E/A wird bevorzugt in x86-basierte Architekturen, da die Anweisungen, die portbasierte E/A durchführen Anweisung oder Wert im Register DX bestimmt, welcher Port der Quell- oder Zielport der Übertragung ist.[2][3] Da ein allgemeines Register Daten an oder von E/A-Geräten für Speicher- und Speicher-abgebildete E/A-Geräte senden oder empfangen kann, verwendet I/A-Speicher-abgebildetes E/A weniger Anweisungen und kann schneller ausgeführt als die Port-I/A. AMD erweiterte die Anweisungen der Port -I/A bei der Definition der Anweisungen nicht x86-64 Architektur zur Unterstützung von 64-Bit-Ports, sodass 64-Bit-Überweisungen nicht mithilfe von Port-E/A durchgeführt werden können.[4]
Gedächtnisbarrieren
Seit der Caches Vermitteln Sie Zugriffe auf Speicheradressen, Daten, die an verschiedene Adressen geschrieben wurden Schreiben Sie Puffer garantiert nicht, dass die Daten die Peripheriegeräte in dieser Reihenfolge erreichen.[5] Jedes Programm, das nicht enthält Cache-Flushing Anweisungen nach jedem Schreiben in der Sequenz können unbeabsichtigte IO -Effekte angezeigt werden, wenn ein Cache -System die Schreibreihenfolge optimiert. Schreibvorgänge in das Gedächtnis können häufig neu beordnet werden, um die Redundanz zu verringern oder den Speicherzugriffszyklen besser zu nutzen, ohne den endgültigen Zustand des gespeicherten Zustands zu ändern. Die gleichen Optimierungen könnten die Bedeutung und Wirkung von Schreibvorgängen auf das von Gedächtnisungen abgebildete E/A-Regionen vollständig ändern.
Die mangelnde Voraussicht bei der Wahl der von den Speicherkartierungen abgebildeten I/A-Regionen führte zu vielen Barrieren der Ram-Kapazität in älteren Generationen von Computern. Die Designer erwarteten selten, dass Maschinen wachsen, um die theoretische RAM-Kapazität einer Architektur voll auszutauschen, und verwendeten daher häufig einige der hochrangigen Bits des Adressraums als Selektoren für die von Speicher eingebaute E/A-Funktionen. Zum Beispiel die 640 KB Barriere Im IBM -PC und Derivate liegt die Reservierung der Region zwischen 640 und 1024 kb (64K -Segmente 10 bis 16) für die Oberspeicherbereich. Diese Wahl hatte zunächst nur geringe Auswirkungen, begrenzte jedoch schließlich die Gesamtmenge an RAM, die innerhalb des 20-Bit-verfügbaren Adressraums verfügbar ist. Das 3 GB Barriere und PCI -Loch sind ähnliche Manifestationen davon mit 32-Bit-Adressräumen, die durch Details der x86 Boot -Prozess und MMU Entwurf. 64-Bit-Architekturen haben technisch oft ähnliche Probleme, aber diese haben jedoch nur selten praktische Konsequenzen.
Beispiele
Adressbereich (hexadezimal)) | Größe | Gerät |
---|---|---|
0000–7fff | 32 Kib | RAM |
8000–80ff | 256 Bytes | Allzwecke I/O |
9000–90ff | 256 Bytes | Sound Controller |
A000 - A7ff | 2 Kib | Videocontroller/Text-Made-RAM anzeigen RAM anzeigen |
C000 -FFF | 16 Kib | Rom |
Ein einfaches System, das um eine aufgebaut ist 8 Bit Mikroprozessor Könnte 16-Bit-Adresslinien bereitstellen, sodass es bis zu 64 adressieren kannKibibyten (Kib) des Gedächtnisses. Auf einem solchen System kann der erste 32 KIB -Adressraum zugeteilt werden Arbeitsspeicher (RAM), weitere 16 Kib zu Nur-Lese-Speicher (ROM) und der Rest zu einer Vielzahl anderer Geräte wie Timer, Zähler, Video -Display -Chips, Sound -Generierungsgeräten usw.
Die Hardware des Systems ist so angeordnet, dass Geräte im Adressbus nur auf bestimmte Adressen reagieren, die für sie bestimmt sind, während alle anderen Adressen ignoriert werden. Dies ist die Aufgabe der Adressdecodierungsschaltungund das legt die fest Speicherkarte vom System. Infolgedessen kann die Speicherkarte des Systems wie in der Tabelle rechts aussehen. Diese Speicherkarte enthält Lücken, die auch in tatsächlichen Systemarchitekturen häufig vorkommt.
Angenommen, das vierte Register des Videocontrollers legt die Hintergrundfarbe des Bildschirms fest, kann die CPU diese Farbe durch Schreiben eines Wertes an den Speicherort A003 mithilfe ihrer Standard -Speicherbeschreibung einstellen. Mit derselben Methode können Diagramme auf einem Bildschirm angezeigt werden, indem Zeichenwerte in einen speziellen RAM -Bereich innerhalb des Videocontrollers geschrieben werden. Vor billig RAM Das war aktiviert Bitverordnete AnzeigenDiese Charakterzellmethode war eine beliebte Technik für Computervideo -Displays (siehe Text Benutzeroberfläche).
Grundlegende Arten von Adressdecodieren
Adressdecodierungstypen, bei denen ein Gerät Adressen vollständig oder unvollständig dekodieren kann, enthalten Folgendes:
- Vollständige (erschöpfende) Dekodierung
- 1: 1 Zuordnung eindeutiger Adressen zu einem Hardwareregister (physischer Speicherort). Beinhaltet die Überprüfung jeder Zeile der Adressbus.
- Unvollständige (teilweise) Dekodierung
- N: 1 Zuordnung von n eindeutigen Adressen in ein Hardwareregister. Durch die teilweise Dekodierung kann ein Speicherort mehr als eine Adresse haben, sodass der Programmierer auf einen Speicherort mit n verschiedenen Adressen referenzieren kann. Es kann auch getan werden, um die Dekodierungshardware zu vereinfachen, indem eine einfachere und oft billigere Logik verwendet wird, die nur einige Adresslinien untersucht, wenn nicht der gesamte Adressraum der CPU erforderlich ist. In der Regel ist die Dekodierung selbst programmierbar, sodass das System nach Bedarf seine eigene Speicherkarte neu konfigurieren kann, obwohl dies eine neuere Entwicklung ist und im Allgemeinen in Konflikt mit der Absicht, billiger zu sein.
- Synonyme: Foldback, multiplizieren, teilweise zugeordnet, Adresse Aliasing.[6][7]
- Lineare Decodierung
- Adresslinien werden direkt ohne Dekodierungslogik verwendet. Dies geschieht mit Geräten wie RAMs und ROMs, die eine Abfolge von Adresseingängen haben, und mit peripheren Chips, die eine ähnliche Abfolge von Eingaben für die Ansprache einer Registerbank aufweisen. Die lineare Adressierung wird selten allein verwendet (nur wenn nur wenige Geräte im Bus vorhanden sind, da die Verwendung einer rein linearen Adressierung für mehr als ein Gerät normalerweise viel Adressraum verschwendet), sondern mit einer der anderen Methoden kombiniert wird, um ein Gerät oder ein Gerät oder ein Gerät auszuwählen oder Gruppe von Geräten, in denen die lineare Adressierung ein einzelnes Register oder Speicherort ausgewählt wird.
Port -I/A über Gerätefahrer
In Windows-basierten Computern kann auch über bestimmte Treiber wie Dollx8KD auf Speicher zugegriffen werden, wodurch E/A-Zugriff in den meisten Windows-Plattformen von Windows 95 bis Windows 7. Installieren von E/A in den meisten Windows-Plattformen zugänglich ist Port -Treiber gewährleisten den Speicherzugriff, indem die Treiber mit einfachen DLL -Aufrufen aktiviert werden, die die Port -E/A -Anschlüsse ermöglichen. Wenn nicht benötigt wird, kann der Fahrer geschlossen werden, um den unbefugten Zugriff auf die E/A -Anschlüsse zu verhindern.
Linux liefert die pcimem Dienstprogramm, um das Lesen von MMIO -Adressen zu ermöglichen. Der Linux -Kernel ermöglicht auch den MMIO -Zugriff aus Kernelmodulen (Treibern) mit dem Kernel des Kernels Mmiotrace Debug -Einrichtung. Um dies zu aktivieren, sollte der Linux -Kernel mit der entsprechenden Option kompiliert werden. Mmiotrace Wird zum Debuggen von Treibern für geschlossene Quellen verwendet.
Siehe auch
- MMAP, nicht verwechselt mit dem maßstabulierten i/o
- Speicher-abgebildete Datei
- Frühe Beispiele für Computer mit portlichter I/O
- PDP-11, ein frühes Beispiel für eine Computerarchitektur mit maßstabuldigem I/O
- Unibus, ein dedizierter E/A-Bus, der vom PDP-11 verwendet wird
- Eingangs-/Ausgangsbasisadresse
- Bankwechsel
- Ralf Browns Interrupt -Liste
- Coprozessor
- Direkter Speicherzugriff
- Erweiterte Konfiguration und Leistungsschnittstelle (ACPI)
Verweise
- ^ "I/O - Eingang/Ausgabe" (PDF). people.cs.clemson.edu.
- ^ "Intel 64 und IA-32 Architekturen-Softwareentwicklerhandbuch: Band 2A: Anweisungssatz, A-M" (PDF). Intel 64 und IA-32 Architektures-Softwareentwicklerhandbuch. Intel Corporation. Juni 2010. S. 3–520. Abgerufen 2010-08-21.
- ^ "Intel 64 und IA-32 Architekturen-Softwareentwicklerhandbuch: Band 2B: Anweisungssatz, N-Z" (PDF). Intel 64 und IA-32 Architektures-Softwareentwicklerhandbuch. Intel Corporation. Juni 2010. S. 4–22. Abgerufen 2010-08-21.
- ^ "AMD64 Architekturprogrammiererhandbuch: Band 3: Allzweck- und Systemanweisungen" (PDF). AMD64 Architekturprogrammierhandbuch. moderne Mikrogeräte. November 2009. S. 117, 181. Abgerufen 2010-08-21.
- ^ Arm Cortex-A Series Programmer's Guide. Literaturnummer Arm Den0013d. S. 10–3.
- ^ Microsoft (4. Dezember 2001). "Partielle Adressdecodierung und I/A -Speicherplatz in Windows -Betriebssystemen".
- ^ HP. "Aliasing" Adresse ".