17 Stimmen

Worauf bezieht sich die Portadresse 0x80?

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.

24voto

myron-semack Punkte 6056

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.

PCI Post Code board

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.

4voto

ShinTakezou Punkte 9154

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() y outw_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 verwenden 0x80 für ihre Verspätung, so müssen Sie den Zugang zu Port 0x80 con ioperm() zuerst (Ausgänge an Port 0x80 sollte keinen Teil des Systems beeinträchtigen). Für weitere vielseitige Methoden der Verzögerung, lesen Sie weiter.

3voto

Sharon Katz Punkte 778

enter image description here

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X