Wie wird der E / A-Adressraum den Geräten zugeordnet?

8

Ich hoffe, dass die Frage so gut formuliert ist, dass jemand sie verstehen kann.

Ich verstehe diesen Hauptspeicher (RAM) und für Port I / O getriebene I / O, es hat seinen eigenen Adressraum, den Anweisungen wie IN, OUT verwenden.

Wenn man ein Real-Mode-Assembler-Programm schreiben würde, wäre es dann Sache des Entwicklers, die notwendigen Unterlagen zu haben, die zeigen, welche Adressbereiche bestimmte Steckplätze auf dem Motherboard in welchem ​​Adressbereich haben? Angenommen, der PCIe-Steckplatz ist die Adresse X, Drucker Y.

Sind die Adressen abhängig vom Bustyp ein Standardadressbereich?

Was kann ich lesen, um das besser zu verstehen? Hoffe jemand kann helfen. Danke.

~ bearbeiten

Bezug auf PC-Systeme.

    
Ryan Warren 10.02.2012, 03:20
quelle

2 Antworten

13

Auf einem x86-PC verwaltet das BIOS normalerweise die Zuweisung des flachen / physischen Adressraums, und alles benutzt einen Platz in diesem Raum. Also wird das BIOS die pcie-Geräte "aufzählen", indem es auf jeden pcie-Slot hinausgeht, um zu sehen, ob jemand da ist. Es gibt Standardkonfigurationsregister, von denen ein PCE-Gerät einige anzeigen muss, wie viel Adressraum und welcher Art (E / A-basiert oder Speicher gemappt) ist. Das BIOS versucht, alle glücklich zu machen und ihnen zu geben, was sie wollen. Windows oder Linux werden diese Geräte oder Adressen nicht neu zuordnen, sie nehmen, was ihnen vom BIOS gegeben wird. Nicht jedes pcie-System funktioniert so, aber leider funktioniert so ein PC.

Also, wenn Sie in die Schrauben und Muttern kommen wollen, holen Sie sich dieses Buch Ссылка Ich denke, es gibt einen Download-Link für Sie, wenn Sie "pci-Systemarchitektur" google

Wenn Sie linux ausführen, dann finden Sie die Quellen für lspci, es gibt einige Bibliotheken und Beispiele, die Sie auseinander reißen und Ihre eigenen erstellen können, um zu untersuchen, welche Geräte in Ihrem System sind und wie ihre Basisadresse und Speicherbereich sind. Wahrscheinlich werden Sie nur das tun wollen, was andere Betriebssysteme tun, und die pcie-Host-Controller lesen, um zu sehen, was wo zugewiesen wurde, und diese Information an die auf diesem System laufende Software liefern. Sie könnten einmal booten und der Drucker erhält die Adresse 0xE0000000 und beim nächsten Mal 0xDB000000, stellen Sie Ihrer Umgebung einen Mechanismus zur Verfügung, um diese Adressen zu geben, oder abstrahieren Sie diese an eine feste Adresse im Adressraum Ihrer Umgebung und lassen Sie Ihren Code die Übersetzung ins Physische verwalten / reale Adresse für das Gerät.

Ich nehme an, mit dem Begriff Real-Modus sprichst du von einem Geschmack des x86-Systems, und das ist wahrscheinlich ein PC von etwas Geschmack. Vielleicht ein Mac. Ich weiß nicht genau, wie ein Mac das macht, ich weiß nicht genug über ihre Aufzählung. Die Hardware ist wahrscheinlich immer noch ein Intel-Prozessor mit einer Nord- und Südbrücke, gefolgt von einer Anzahl von PC-Brücken oder anderen Intel-Chips, die letztendlich in einer Anzahl von PC-Vorrichtungen enden, die entweder auf der Platine (Videochips usw.) oder PCE-Slots aufgelötet sind für Steckkarten. Wenn Sie Linux ausführen und lspci verwenden und sich die Hersteller- und Teilenummer ansehen, finden Sie die meisten Handbücher / Datenblätter für die Intel (Vendor ID 8086) -Geräte auf der Website von Intel, und Sie können lspci und seine Schwesterprogramme verwenden, um das Steuerelement zu untersuchen und Status-Register in diesen pcie-Controllern, wieder, wenn Sie daran interessiert sind, tiefer in das zu graben, bin ich mir nicht sicher, was Ihr eigentliches Interesse ist.

Die Adressen sind kein Standard oder fest, jedes Bios ist halb-kundenspezifisch an das Motherboard-Modell, der Adressbereich für den pcie-Bereich ist typischerweise ein Gig oder weniger des gesamten Prozessorraums, aber dieses Fenster ändert sich mit dem Verschieben Sie auf 64 Bit und die Notwendigkeit für mehr Speicherplatz (eine langsame Bewegung). Der Ort dieses PCie-Fensters hängt von der Hardware ab (siehe die Datenblätter, die ich für diese verschiedenen Intel-Geräte erwähnt habe, oder via oder NVIDIA oder wer auch immer, wenn es ein AMD-System ist), wenn das BIOS so konfiguriert ist, dass es im 32-Bit-Modus läuft für alle pcie-Geräte könnte irgendwo zwischen den 2 Gig, aber natürlich unter der 4 Gig-Marke, aber das bedeutet nicht, dass alle diese Systeme die 3 Gig-Marke verwenden. für 64 Bit glaube ich, dass sie auch in der Nähe der Spitze sind, aber von Motherboard zu Motherboard ändert sich das. Wenn es darum geht, den Bus zu nummerieren, ist es sowohl Motherboard-spezifisch als auch individuell computerspezifisch, einige Geräte sind auf dem Motherboard verschraubt / gelötet und werden jedes Mal in derselben Reihenfolge aufgezählt, aber Karten, die man in die Slots steckt, müssen auf die antworten Host und manchmal aufgezählt basierend auf wer zuerst antwortet, können Sie 20 mal booten und sehen das gleiche Layout, noch einmal booten und zwei Karten können Standorte tauschen, weil die Reihenfolge, die sie aufgezählt wurden, geändert. Auch wenn es scheint, dass Ihre Grafikkarte immer an der gleichen Stelle ist, codieren Sie diese Nummer nirgendwo fest, scannen Sie immer den PC-Bus oder die Tabellen oder machen Sie Bibliotheksanrufe, um herauszufinden, wo sich was befindet. Es wird sich wahrscheinlich nicht bewegen, wenn Sie etwas finden, bis Sie es neu starten und es erneut versuchen. Sie müssen also nicht jedes Mal neu scannen, um herauszufinden, wo sich etwas befindet, wenn Sie darauf zugreifen möchten.

Ja, wenn Sie Ihr Bios upgraden oder downgraden, ist das Bios nur Software, manchmal haben die Bios-Änderungen mit pcie-Enumeration zu tun (nicht so ungewöhnlich, sagen eine populäre Grafikkarte funktioniert nicht gut auf einem Motherboard, das sie eine Mod in die Bios-Software, um den Reset oder was auch immer zu ändern, um dieser Karte eine bessere Chance zu geben, zu arbeiten) und das die Aufzählung für das ganze System ändern kann.

    
old_timer 10.02.2012, 03:45
quelle
0

Wenn man ein Real-Mode-Assembler-Programm schreiben würde

ISRs sind was Sie suchen (Interrupt-Dienstroutinen).
;

Dies ist eine Liste von Interrupt-Handler-Adressen, die im ersten Speichersegment gespeichert sind. (Segment 0000). Jede Interrupt-Nummer hat eine 4-Byte-Handler-Adresse, Segment und Offset, an welches ein Programm verzweigen wird, wenn dieser Interrupt aufgerufen wird.

Die Adresse kann durch Multiplizieren der Interrupt-Nummer mit 4 ermittelt werden. Dies ist der Offset, bei dem die Adresse des Handlers gespeichert wird.

Der ISR-Standort kann als 0000 definiert werden: ax * 4, DOS-Interrupts haben die generische Nummer 21h. Also lade einfach ax mit dem (oder al)

Es gibt hier eine Liste mit DOS-Interrupts ... es ist ziemlich groß ...

Ссылка

    
ady 18.06.2013 17:32
quelle