PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : x86 Memory mapped I/O Frage


roidal
2011-06-20, 15:12:20
Kann mir jemand erklären wie Geräte in den (Memory-)Adressbereich gemappt werden? Gibt es dafür eigene Befehle oder werden statt dessen Tables verwendet damit die/der CPU/Chipsatz (je nachdem wo der memory-controller ist) feststellen kann welche Adressen nun in den Hauptspeicher, und welche Adressen zu den Devices geroutet werden müssen?

mfg
Roland

Coda
2011-06-20, 15:19:57
Das ist eine Sache der Northbridge. Spezielle Befehle gibt's dafür nicht. Man muss nur die entsprechenden physikalischen Speicheradressen ansprechen, also dafür entsprechende Page-Table-Einträge für den Kernel-Space anlegen.

Bei der Initialisierung der PCI-Geräte mappt die Northbridge die physikalischen Adressen wohl selbstständig und gibt die Adressen dann über die PCI-Konfigurationstabellen an das Betriebssystem weiter.

Im 64-Bit-Modus wird's dann nochmal komplexer, weil da eine weitere Umsetzung erfolgt, bei der die physikalischen 32-Bit-Adressen der Geräte auf höhere physikalische 64-Bit Adressen umgebogen werden, damit man das physikalische Speicherloch zwischen 3 und 4 GiB nicht hat und man den RAM an diesen Adressen dann trotzdem ansprechen kann. Diesen Schritt muss aber das Betriebssystem selber veranlassen soweit ich weiß.

Letzteres ist aber nur nötig, wenn die Geräte nur 32-Bit-Adressen verstehen. Ansonsten können diese gleich so konfiguriert werden, das sie eine 64-Bit-Adresse verwenden, die nicht im Weg ist und die Umsetzung dann wegfällt. Gibt's derzeit aber soweit ich weiß fast nicht.

Übrigens ist das keine Problem von x86, sondern das Problem tritt in jedem System auf, das einen PCI-(Express)-Bus hat.

roidal
2011-06-20, 15:43:48
Um die physikalischen Speicheradressen gehts mir. Soweit ich das bis jetzt verstanden habe bekommt jedes PCI-Gerät beim Einschalten einen, vom PCI-Slot abhängigen, konfigurations-Speicherbereich zugewiesen. Von diesem kann, erstens das BIOS/OS auslesen wie groß der Speicherbereich fürs MM-IO sein muss, und zweitens dem Gerät einen physischen Adressbereich zuweisen. Nur muss es irgendwie eine Möglichkeit geben der, im Fall von AMD, in der CPU befindlichen crossbar mitzuteilen das dieser Speicherbereich nun nicht mehr zum Speichercontroller sondern zum HT-link geroutet werden muss. Mich würde interessieren wie das genau abläuft, konnte aber bis jetzt noch nichts relevantes finden. Irgendwie kann ich mir nicht vorstellen das die crossbar die PCI-konfigurationsregister, bzw. alle anderen konfirgurationsregister, überwacht um sich darauf automatisch anzupassen.

mfg
Roland

Trap
2011-06-20, 16:01:51
Es gibt da extra Konfigurationsregister für, die festlegen welche Speicherbereiche für MMIO genutzt werden.

Die Details sind z.B. in http://support.amd.com/us/Processor_TechDocs/43170.pdf beschrieben.

Coda
2011-06-20, 16:04:35
Nur muss es irgendwie eine Möglichkeit geben der, im Fall von AMD, in der CPU befindlichen crossbar mitzuteilen das dieser Speicherbereich nun nicht mehr zum Speichercontroller sondern zum HT-link geroutet werden muss. Mich würde interessieren wie das genau abläuft, konnte aber bis jetzt noch nichts relevantes finden. Irgendwie kann ich mir nicht vorstellen das die crossbar die PCI-konfigurationsregister, bzw. alle anderen konfirgurationsregister, überwacht um sich darauf automatisch anzupassen.
hier (http://support.amd.com/us/Processor_TechDocs/24593.pdf) wird das genauer beschrieben für AMD unter 7.9.

Die Konfiguration geschieht über Machine State Registers.

roidal
2011-06-20, 16:18:22
Genau das wars was ich gesucht habe, danke Leute!

mfg
Roland

roidal
2011-06-20, 16:27:09
Eine kleine Frage wär da noch (bevor ich da jetzt noch die Dokus anderer Hersteller durchseh): Ist das bei Intel und VIA gleich oder muss im OS Prozessorhersteller-abhängig implementiert werden?

Coda
2011-06-20, 16:33:56
Machine State Registers sind sogut wie immer Herstellerspezifisch, also wohl eher letzteres.

Es wird sich sogar über die Generationen unterscheiden, denn früher musste man dafür die externe Northbridge entsprechend konfigurieren, was eher nicht über MSRs geschah.

roidal
2011-06-20, 16:40:09
...
Es wird sich sogar über die Generationen unterscheiden, denn früher musste man dafür die externe Northbridge entsprechend konfigurieren, was eher nicht über MSRs geschah.

Genau an die hab ich gedacht... :D

Aber dann dürfte doch theoretisch ein Windows XP nicht auf einem Athlon64 booten, da dieses damals ja noch nichtmal die Funktionen hatte um den A64 entsprechend für die IO's zu konfigurieren? Oder besitzt der möglicherweiße noch Emulationen für die alten Mechanismen?

Coda
2011-06-20, 16:42:41
Das ist eine sehr gute Frage, die sich mir auch gestellt hat. Evtl. macht da ja auch die Firmware (das BIOS) was?

roidal
2011-06-20, 16:47:01
Das würde wohl nur so lange funktionieren, so lange das OS selbst keine Änderungen an den Mappings vornehmen will?!

Coda
2011-06-20, 16:49:11
Ich vermute das ist auch so. Das BIOS konfiguriert alles vor und stellt die entsprechenden Tabellen zur Verfügung.

Ich bin mir nichtmal sicher, ob das OS daran dann überhaupt noch was ändert. Ich schau mal in den Linux-Source. Das ist immer eine gute Quelle, wenn man's genauer wissen will.

mrt
2011-06-20, 17:07:45
Das Mapping ist Aufgabe des BIOS im Zuge der Geräteinitalisierung.
Ihr kennt doch noch das Memory-Hole zwischen 15 und 16MB, das ist ISA zu verdanken ;)

FlashBurn
2011-06-20, 22:38:04
Ich behaupte jetzt einfach mal das ist Aufgabe der PCI Specs. Denn man kann ja die Adresse ändern (und nichts anderes macht das BIOS) und kann auch im BIOS angeben, das es die Geräte halt nicht initialisieren soll.

Theoretisch sollte da nichts mehr in der CPU/Nprthbridge/MemoryController geändert werden müssen. Das wäre dann nämlich meiner Meinung nach nicht mehr Standardkonform.

Das OS muss ja auch immer davon ausgehen, dass das BIOS die Geräte eventuell nicht initialisiert hat und das es das selber machen muss und das sollte dann auch CPU unabhängig gehen. Ansonsten macht der ganze PCI Standard ja kein Sinn.

Coda
2011-06-20, 22:57:16
Es geht nicht CPU unabhängig.

FlashBurn
2011-06-20, 23:05:40
Es geht nicht CPU unabhängig.

Warum nicht und wozu gibt es dann den PCI Standard, der ja mMn sagt, das man in den BARs die Adresse eingeben kann?

Wenn ich morgen die Zeit finde, versuche ich mal es auszuprobieren. Auf welchen CPUs sollte es denn auf keinen Fall gehen?

Coda
2011-06-21, 00:00:49
Wenn du die BARs programmierst dann sagst du nur dem PCI-Gerät welche Adressen es verwenden soll. Die CPU weiß davon dann trotzdem nichts.

roidal
2011-06-21, 08:43:58
Waren zu Zeiten des FSB die Geräte und der Memory Kontroller physikalisch auf dem selben Bus?

Coda
2011-06-21, 13:34:44
Ne, der FSB verbindet CPU und Northbridge und die Northbridge hat dann einen separaten PCI-Bus.

roidal
2011-06-21, 13:45:01
Dann müsste der Chipsatz selbt auch auf irgendeiner Basis routen?

Trap
2011-06-21, 13:57:02
Dann müsste der Chipsatz selbt auch auf irgendeiner Basis routen?
Ich würde annehmen, dass es prinzipiell genauso funktioniert wie bei integrierter Northbridge. Die Konfigurationsregister muss man dann eben über den FSB setzen und nicht per CPU MSR.