Wie funktioniert I/O auf Maschinenebene?

paulyST

Cadet 4th Year
Registriert
Nov. 2013
Beiträge
105
Hallo zusammen,

was funktioniert genau, wenn beispielsweise eine Taste gedrückt, oder Maus bewegt wird? Soweit ich es verstanden habe, wird der Befehl in Binärcode an den jeweiligen Hardware-Controller des Peripheriegeräts gesendet und gespeichert.
Von dort gibt es zwei Möglichkeiten, wie die Daten von der CPU "abgeholt" werden.
a) memory mapped I/O: Addresse wird auf RAM gemappt; Mikroprozessor kann wie bei jeder anderen Addresse des RAMs auch auf das Gerät zugreifen
b) isolatated I/O: Mikroprozessor muss extra Befehlssatz und holt die Daten nicht "über den RAM"

Ich bin mir allerdings bei zwei Sachen nicht ganz sicher:
1) Wird im Controlle wirklich alle Daten "zwischengespeichert", bis diese vom CPU ausgelesen werden? Wie sieht das bei Festplatten aus? Dort sind ja gewaltige Mengen zu bewegen. Wieviel Platz ist auf so einem Controller?
2) Bezüglich der Speicheraddressierung ist zwischen memory mapped und isolated I/O der einzige Unterschied, dass in einem z.b. 32bit-System der gesamte Speicherbereich im ersten Fall auf die Ram Speicherzellen zeigt und im zweiten Fall, ein Teil der 32bit auf die Speicherzellen im Ram und andere Teile den Speicher der verschiedenen Controller addressieren?

Ist als Laie nicht leicht zu beschreiben, ich hoffe ihr könnt meinen Gedankengang nachvollziehen.
- Pauly
 
zu 1) die Größe des Speichers ist sehr unterschiedlich. Je schneller die Verbindung, je größer i.d.R der Zwischenspeicher. Das ist in der Regel ein FIFO Speicher von einigen Byte bis einigen Kilobyte. Bei Festplatten auch noch deutlich mehr.
Bei Festplatten gibt es aber in der Festplatte zusätzlich einen Spur Cache, der die Daten mindestens einer Spur halten kann.
Der Controller auf dem Mainboard hat ebenfalls entweder einen kleineren Speicher oder die Übertragung erfolgt direkt in den Hauptspeicher (DMA).

zu 2)
Auch das ist unterschiedlich. So gibt es Prozessoren mit separaten IO Port Adreßleitungen, andere haben nur eine Leitung und zeigen damit an, das die Adresse auf den Adreßleitungen für einen IO Kontroller ist.
Die Controller der Schnittstellenkarte selbst haben wesentlich weniger Leitungen, nämlich nur so viele, wie Register angesprochen werden müssen. Bei 8 Registern also nur drei Leitungen. Die Aussteuerung übernimmt eine einfache Schaltung heute über den Plattform Controller Hub.
 
Es gibt natürlich ein Handshake-Verfahren, daß bei vollem Puffer die Übertragung anhält.

Bei der seriellen Schnittstelle war es vor 30 Jahren mal so, daß ein Byte in einem Register abgelegt war und daraufhin ein Interrupt signalisiert wurde (IRQ4 oder so). Dadurch wurde die CPU gestoppt, hat alle ihre Register auf den Stack geschoben und und dann das Unterprogramm (Assembler-Routine) gestartet um das eine Byte auszulesen. Anschließend wurden wieder die Register geladen und die CPU machte weiter mit dem, was vorher lief.
Das war natürlich Shice-langsam und umständlich (und das ist schon geschönt ausgedrückt). Dann gab es 16650-Chips mit 8 oder 16 Byte Puffer, da konnte man gleich mehrere Byte am Stück abholen (wow!).
Für Festplatten gab es lange Zeit die PIO-Transfers, ähnlich langsam, 1-5MB/s. Im MS-DOS hat man sogar noch in der config.sys mit "buffers" die Zahl der 512-Byte-Puffer definiert.

Die Daten werden zwar tatsächlich zwischengespeichert, wenn die Daten aber schnell genug abgeholt werden, ist das kein Problem. Da die Festplatte aber nicht angehalten wird, ist der Puffer der HDD mindestens so groß, daß eine komplette Spur reinpaßt. Die Caches (heute 32, 64, 128MB) sind ja angegeben. Ansonsten gilt: ist der Puffer voll, wird gewartet. Ist der Puffer klein und ständig voll, wird eben auch ständig gewartet. Bei Notebooks wird oft an allem gespart, was Strom verbraucht oder teuer ist, u.a. an Caches in der CPU und in den HDDs. Im Ergebnis ist ein i7-Notbook nicht zu vergleichen mit einem i7-PC.

Der Transfer per Memory (DMA) erfolgt nur für DMA-fähige Geräte wie PCI-Bus, Firewire, Thunderbolt. Die CPU gibt dem Gerät einen Speicherbereich (Adresse+Größe) und rechnet dann unabhängig weiter. Das DMA-fähige Gerät erledigt diesen Transfer zusammen mit dem DMA-Controller. Deshalb kann es vorteilhaft sein, wenn der Speicher schneller angebunden ist, als die CPU selber, damit der Engpaß nicht zu groß wird, wenn beide gleichzeitig zum RAM wollen.

USB ist kein DMA-Gerät, sondern die CPU pollt (fragt nach, ob Daten vorhanden sind). Deshalb ist die CPU stärker belastet und die Latenzen sind hoch. Hardcore-Gamer bevorzugen deshalb den uralten PS/2-Anschluß.

Firewire macht DMA und man kann per Firewire den RAM eines PCs auslesen, ohne die CPU zu fragen, was eine große Sicherheitslücke darstellt. Gleiches gilt für Thunderbolt.
 
Vielen Dank, ihr zwei.

Ich kann leider nur auf das wenigste eingehen, da das meiste für mich reinstes Spanisch ist ;)

1) Bei den Controllern war ich wohl in meiner Annahme richtig. Dazu fällt mir noch etwas ein. Wenn ich bei meinem 32bit-Prozessor insgesamt, 2^32 Addressen ansprechen kann, wäre die maximale Anzahl an RAM ja abhängig von den Controllereinstellungen der Peripheriegeräte, oder?
Wenn diese nämlich zusammen 2Gig Speicher in der Summe besitzen, würden 2Gig-Arbeitsspeicher doch genauso ausreichen, oder? Zumindest im islated I/O fall (mit 32bit können dann so, 2gig Arbeitsspeicher und 2gig anderer Speicher angesprochen werden). Im memory mapped I/O-Fall würde ich 4Gig ram benötigen, da schließlich der gesamte Addressraum auf den RAM bezogen ist, und Peripheriegeräte darüber "angesprochen" werden?

2. Leider nicht verstanden :/ :D
 
zu 1)
Die meisten dieser Speicher sind FIFO Speicher. Das heiß man liest immer dieselbe Adresse und leert den damit. So gehen nur wenige kB an Speicherbereich "verloren". (Gegenbeispiel Grafikkarte)
zu 2)
bei memory mapped I/O wird ein Teil des Speicherbereiches (meistens der obere) auf die Peripheriecontroller umgeblendet.
bei ported (isolated) I/O bleibt der Speicherbereich für RAM verfügbar, dafür werden aber mehrere Takt-Zyklen für das Umschalten auf die Port Bereiche und das Ansprechen der Peripheriecontroller "verbraucht".
 
Was meinst du mit "Gegenbeispiel Grafikkarte"? Dachte die Grafikkarte wäre selbst ein Controller (in diesem Fall für den Monitor)?
 
Die Grafikkarte macht MMIO. Das bedeutet, du schreibst an eine Speicherstelle, die es eig. nicht gibt, aber das wandert dann auf die Grafikkarte.
Da das auch mal ordentlich viel ist, werden gleich 128 MB gemappt (bei meiner Grafikkarte).
Aber:
Wenn du nur 2^32 ansprechen kannst (32 bit) und 4 GB RAM drin hast, kannst du nicht mehr alles mit Adressen abdecken, entweder der ganze RAM und keine Adresse mehr für die Grafikkarte oder eben etwas RAM nicht nutzen und diese Adressen an die Grafikkarte geben.

Die Grafikkarte selbst ist alles mögliche, auch ein Controller aber heutzutage eher ein eigenständig programmierbarer Prozessor.
 
Zurück
Oben