2010-12-02 5 views
7

ich manchmal Aussagen sehen, dass auf einigen Plattformen die folgenden C oder C++ Code:Welche realen Plattformen ordnen Hardware-Ports Speicheradressen zu?

int* ptr; 
*ptr = 0; 

schriftlich an einem Hardware-Input-Output-Anschluss führen kann, wenn ptr die Adresse speichern geschieht demjenigen Port zugeordnet ist. Normalerweise werden sie als "eingebettete Plattformen" bezeichnet.

Was sind echte Beispiele für solche Plattformen?

+0

speicherkonforme I/O? – Chubsdad

+2

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 –

+0

Siehe http://stackoverflow.com/questions/15371953/memory-map-io-vs-port-maped-io – Pacerier

Antwort

9

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.

+0

Ich habe getan Nachforschungen zu diesem Thema in letzter Zeit, und Ihre Antwort erwies sich als äußerst nützlich. Ich habe ein paar Fragen: Welche Geräte verwenden den E/A-Adressraum? Und da der Speicher für speicherkonforme Geräte und alle Programme (im Speicher abgebildeten I/O) üblich ist, was würde passieren, wenn der Speicherabbildungsraum verwendet wird? Ist dieser Raum für diese Zeit nicht verfügbar? – Cygnus

+0

Einige Beispiele für Geräte, die den I/O-Adressraum auf PCs verwenden, sind Dinge wie die PS/2-Tastatur, ältere COM-Anschlüsse. Ich bin sicher, da sind noch ein paar andere Dinge. Ich bin kein Hardware-Designer, also weiß ich nicht, ob ein neues Gerät den I/O-Raum nutzen würde oder lieber den Speicherbereich, selbst wenn die Anzahl der beteiligten Ports klein ist (mir scheint das fast alles zu sein) mit Ausnahme von Videoadaptern, die heutzutage an USB oder SATA angeschlossen werden. –

+0

In Bezug auf den Anwendungszugriff auf Speicherzuordnungs-E/A wird in Systemen, die virtuelle Adressen unterstützen, dieser Speicher normalerweise nicht im Prozessbereich abgebildet, außer vielleicht durch eine bestimmte Anforderung, die es dem System ermöglicht, zwischen Anwendungen zu arbitrieren. –

1

PlayStation. So erhielten wir direkten Zugriff auf Low-Level-Grafik (und andere) Features des Systems.

2

Dies wird Memory-mapped I/O genannt, und ein guter Ausgangspunkt ist der Wikipedia article.

Moderne Betriebssysteme schützen Sie normalerweise vor dem Schreiben von Treibern, aber diese Technik ist sogar auf PC-Architekturen relevant. Erinnern Sie sich an die DOS 640Kb Grenze? Dies liegt daran, dass Speicheradressen von 640 KB bis 1 MB für E/A zugewiesen wurden.

1

An NDIS Treiber unter Windows ist ein Beispiel. Dies wird als speicherabgebildete E/A bezeichnet und der Vorteil davon ist die Leistung.

0

Motorola 68k-Serie und PowerPC sind die Großen.

1

Siehe für Beispiele von Geräten, die Memory-Mapped I/O verwenden, z. Router, Adsl-Modems, Mikrocontroller usw.

1

Es wird meistens beim Schreiben von Treibern verwendet, da die meisten Peripheriegeräte über Speicherregister mit der Haupt-CPU kommunizieren.

-1

Sie können dies in modernen Windows (und ich bin mir ziemlich sicher, Linux bietet es auch). Es nennt sich Memory-Mapped-Dateien. Sie können eine Datei unter Windows in den Speicher laden und sie dann schreiben/ändern, indem Sie einfach Zeiger manipulieren.

+0

Ich denke nicht, dass das das ist, worüber das OP spricht. Memory Mapped I/O unterscheidet sich von Memory Mapped-Dateien . –

Verwandte Themen