Die meisten Systeme verwenden nach meiner Erfahrung Memory-Mapped I/O. Die x86-Plattform verfügt über einen separaten, nicht speicheradressierten E/A-Adressraum (der die in
/out
Familie von Prozessor-Op-Codes verwendet), aber die PC-Architektur verwendet auch den Standard-Speicheradressraum für Geräte-E/A. Das hat einen größeren Adressraum, einen schnelleren Zugriff (allgemein) und eine einfachere Programmierung (allgemein).
Ich denke, dass der separate E/A-Adressraum anfänglich verwendet wurde, weil der Speicheradressraum von Prozessoren manchmal ziemlich begrenzt war und es wenig Sinn machte, einen Teil davon für den Gerätezugriff zu verwenden. Sobald der Speicheradressraum auf Megabyte oder mehr geöffnet wurde, wurde der Grund, E/A-Adressen von Speicheradressen zu trennen, weniger wichtig.
Ich bin nicht sicher, wie viele Prozessoren einen separaten I/O-Adressraum bieten, wie der x86 tut. Als Hinweis darauf, wie der separate E/A-Adressraum in Ungnade gefallen ist, wurde, als die x86-Architektur in den 32-Bit-Bereich wechselte, nichts unternommen, um den E/A-Adressraum von 64 KB zu erhöhen (obwohl sie die Fähigkeit hinzufügten) um 32-Bit-Datenblöcke in einem Befehl zu verschieben). Als x86 in den 64-Bereich verschoben wurde, blieb der E/A-Adressraum bei 64 KB und sie fügten nicht einmal die Fähigkeit hinzu, Daten in 64-Bit-Einheiten zu verschieben ...
Beachten Sie auch, dass moderne Desktop-und Server-Plattformen (oder andere Systeme, die virtuellen Speicher verwenden) ermöglichen einer Anwendung in der Regel nicht den Zugriff auf E/A-Ports, unabhängig davon, ob sie im Speicher zugeordnet sind oder nicht. Dieser Zugriff ist auf Gerätetreiber beschränkt, und sogar Gerätetreiber verfügen über eine OS-Schnittstelle, um mit virtuellen Speicherzuordnungen der physischen Adresse umzugehen und/oder den DMA-Zugriff einzurichten.
Auf kleineren Systemen, wie z. B. eingebetteten Systemen, wird häufig direkt auf die E/A-Adressen von der Anwendung zugegriffen.Bei Systemen, die speicheradressierte Adressen verwenden, wird dies normalerweise durch einfaches Setzen eines Zeigers mit der physischen Adresse des I/O-Ports des Geräts und Verwenden dieses Zeigers wie bei jedem anderen erfolgen. Um sicherzustellen, dass der Zugriff in der richtigen Reihenfolge erfolgt und auftritt, muss der Zeiger jedoch als auf ein Objekt volatile
zeigend deklariert werden.
Um auf ein Gerät zugreifen zu können, das etwas anderes als einen speicherprogrammierten E/A-Port verwendet (wie der E/A-Adressraum des x86), stellt ein Compiler im Allgemeinen eine Erweiterung zur Verfügung, mit der Sie diesen Adressraum lesen oder schreiben können . Wenn keine solche Erweiterung vorhanden ist, müssen Sie eine Assemblersprachfunktion aufrufen, um die E/A auszuführen.
speicherkonforme I/O? – Chubsdad
Nur um all die Antworten hinzuzufügen, tut dies auch Ihre x86-Plattform (Memory Mapped I/O). Sie sind nur gewohnt, in einer geschützten Umgebung [1] zu arbeiten, die von Ihrem Betriebssystem erstellt wurde, so dass Sie nicht alle schmutzigen Aspekte der realen Hardware berühren müssen (oder zufällig). Schreibe einen Treiber, oder besser noch, ein OS und du wirst viel mit Memory Mapped I/O zu tun haben, unter einer ganzen Reihe anderer lustiger Dinge. :) [1] http://en.wikipedia.org/wiki/Protected_mode –
Siehe http://stackoverflow.com/questions/15371953/memory-map-io-vs-port-maped-io – Pacerier