Felix Kaiser
25.09.2005, 11:55
Ich schlage mich gerade mit der Programmierung der nForce NIC herum. Allerdings stehe ich vor einem sehr seltsamen Problem. Das Gerät verwendet Busmastering, so wie viele andere PCI Geräte auch. Man bereitet einen Puffer im Arbeitsspeicher vor, übergibt dem Gerät die physikalische Adresse, an der es den Puffer in einem Stück vorfindet und arbeitet damit. Beim nForce NIC gibt es da allerdings ein Problem: Physikalische Adressen, die im Adressraum des Arbeitsspeichers liegen, akzeptiert er nicht. Der Chip gibt mir beim Paketempfang zu verstehen, er habe keinen Puffer. Beim Senden passiert gar nichts. Wenn ich ihm nun eine Adresse im Adressraum oberhalb des Arbeitsspeichers gebe, dann versucht er tatsächlich zu Daten zu senden. Dass das aber so nichts wird ist denke ich klar, schließlich befinden sich dort keine Daten. Und wenn er versucht Daten in dem Speicherbereich zu empfangen, Schreibzugriffe der Hardware in den Bereich (der außerhalb des RAMs liegt und dem kein Gerät zugeordnet ist) enden mit einem Aufhängen des Systems.
Als logische Schlussfolgerung daraus würde sich nun ergeben, dass ich teile des Arbeitsspeichers in den Hardwareadressbereich oberhalb des Arbeitsspeichers mappen müsste. Einige Recherchen über PCI-DMA ergaben, dass es sowas wie Einblendregister gibt, mit denen das geht, aber die hat kein x86, die findet man beispielsweise auf einem Alpha. Somit befinde ich mich wieder am Ausgangspunkt, an dem erstmal nichts geht.
Der NIC verfügt über keinen eigenen RAM, den ich benutzen könnte. Und die anderen Geräte, die ihren RAM/ROM in den Hardwareadressbereich mappen, die benutze ich nicht dafür, dafür ist das auch gar nicht gedacht.
Falls es doch irgendwie möglich ist, weiß einer eine Möglichkeit Arbeitsspeicher in die Hardwareadressbereiche zu mappen? Ansonsten, hat jemand Erfahrung im Umgang mit dem nForce NIC? Oder kennt jemand Geräte, die sich ähnlich verhalten?
Als logische Schlussfolgerung daraus würde sich nun ergeben, dass ich teile des Arbeitsspeichers in den Hardwareadressbereich oberhalb des Arbeitsspeichers mappen müsste. Einige Recherchen über PCI-DMA ergaben, dass es sowas wie Einblendregister gibt, mit denen das geht, aber die hat kein x86, die findet man beispielsweise auf einem Alpha. Somit befinde ich mich wieder am Ausgangspunkt, an dem erstmal nichts geht.
Der NIC verfügt über keinen eigenen RAM, den ich benutzen könnte. Und die anderen Geräte, die ihren RAM/ROM in den Hardwareadressbereich mappen, die benutze ich nicht dafür, dafür ist das auch gar nicht gedacht.
Falls es doch irgendwie möglich ist, weiß einer eine Möglichkeit Arbeitsspeicher in die Hardwareadressbereiche zu mappen? Ansonsten, hat jemand Erfahrung im Umgang mit dem nForce NIC? Oder kennt jemand Geräte, die sich ähnlich verhalten?