Wenn man einen Befehl sendet und die Daten von einem bestimmten Chip, z. B. der RTC, liest, wird in verschiedenen Dokumenten darauf hingewiesen, dass man eine gewisse Zeit warten sollte, bevor man vom Gerät liest, um sicherzustellen, dass die Daten verfügbar sind. Viele Codes machen einen Dummy-Lesevorgang vom Port 0x80
. Ich wollte wissen, mit welchem Gerät diese Adresse verbunden ist, wenn überhaupt. Ich spreche in Bezug auf die IA-32-PC-Architektur.
Antworten
Zu viele Anzeigen?Der E/A-Anschluss 0x80 wird üblicherweise für POST-Codes verwendet. (POST = Power On Self Test)
Während das System hochfährt, gibt das BIOS eine Reihe von Debug-Codes an den I/O-Port 0x80 aus. Diese sind für die Fehlersuche in einem nicht bootenden System vorgesehen.
In den meisten Desktop-PCs können Sie eine POST-Code-Debug-Karte installieren, bei der es sich im Grunde um eine kleine PCI- (oder ISA-) Steckkarte handelt, die E/A-Schreibvorgänge am E/A-Anschluss 0x80 dekodiert und den Wert über 7-Segment-LEDs anzeigt.
Normalerweise vergehen die POST-Codes sehr schnell. Wenn Ihr System jedoch beim Booten hängen bleibt, können Sie sehen, was der letzte POST-Code war, und diese Information zur Fehlerbehebung verwenden.
Diese Seite enthält eine Liste der Standard-POST-Codes für die meisten BIOSe. Allerdings kann ein Computer-/Hauptplatinenhersteller seine eigenen POST-Codes einfügen, so dass die Liste nicht 100%ig vollständig ist.
Nachdem ein System mit dem Booten des Betriebssystems begonnen hat, sind die POST-Codes nicht mehr sehr relevant. Einige Hersteller von Betriebssystemen verwenden jedoch POST-Code-Karten als Debugging-Werkzeug, insbesondere für Stellen im Code, an denen ein printf() nicht sinnvoll ist (z. B. Interrupt Service Routines).
Einige Betriebssysteme verwenden Lese- und Schreibzugriffe auf den E/A-Anschluss 0x80 als Verzögerungsmechanismus. Wenn Sie ein paar Mikrosekunden warten müssen, bis etwas abgeschlossen ist, kann es unpraktisch sein, vollwertige sleep()- oder delay()-Timer zu verwenden. Lese- und Schreibzugriffe auf 0x80 haben im Grunde keine negativen Auswirkungen auf den Betrieb des Systems, daher ist dies eine gute Wahl für solche Dummy-Operationen.
Bei vielen älteren/langsameren Peripheriegeräten (wie z.B. Ihrem RTC-Chip) ist es manchmal notwendig, einige usec zu warten, bis eine I/O-Schreiboperation "wirksam" wird. Ein Dummy-Zugriff auf 0x80 ist ein bequemer Weg, dies zu tun.
Möglicherweise finden Sie auch Code, der Dummy-Schreibvorgänge auf 0x80 ausführt, um den Bus von elektrischen "Echos" zu "spülen". Auf bestimmten Plattformen ist es möglich, einen Wert an eine unbenutzte/ungültige E/A-Adresse zu schreiben, von dieser Adresse zurückzulesen und den Wert zu sehen, den Sie gerade geschrieben haben, auch wenn sich keine Hardware an dieser Adresse befindet . Wenn Sie jedoch zwischendurch einen Dummy-Schreibzugriff auf eine andere Adresse durchführen (z. B. I/O-Port 0x80), können Sie dies verhindern.
Diese Dummy-Lesevorgänge führen zu einer Verzögerung; von Mini-HOWTO zur Programmierung des Linux-E/A-Anschlusses :
En
inb_p()
,outb_p()
,inw_p()
youtw_p()
Makros funktionieren anders identisch mit den oben genannten, aber sie führen eine zusätzliche kurze (etwa eine Verzögerung (etwa eine Mikrosekunde) nach dem Zugriff auf den Port; Sie können die Verzögerung auf etwa vier Mikrosekunden mit#define REALLY_SLOW_IO
bevor Sie#include <asm/io.h>
.Diese Makros werden normalerweise (sofern Sie nicht
#define SLOW_IO_BY_JUMPING
das ist wahrscheinlich weniger genau) einen Port-Ausgang zum Port verwenden0x80
für ihre Verspätung, so müssen Sie den Zugang zu Port0x80
conioperm()
zuerst (Ausgänge an Port0x80
sollte keinen Teil des Systems beeinträchtigen). Für weitere vielseitige Methoden der Verzögerung, lesen Sie weiter.
Sie können mit diesem Code in einem Kernel-Treiber auf Port 0x80 schreiben (und lesen):
(Beachten Sie, dass einige PCs wie meiner an dieser Stelle ein WORD haben, so dass man 16 Bits dorthin schreiben kann).
Beispiel für einen Windows-Treiber:
__outword(0x80, 0x00A0);
Dies kann auch für Kernel-Debugging in Fällen verwendet werden, in denen Sie kein Zwei-Maschinen-Debugging-System haben und Sie aus irgendeinem Grund keine Debugview-Traces verwenden können (z.B. wenn das System einfriert). Port 80 kann Ihren letzten Debug-Code für Sie aufbewahren.