Hallo, für eine Geschwindigkeitsmessung zwischen Hauptspciher una angeschlossenen Speicher möchte ich den DMA Controller nutzen. Der DMA benötigt PCI addressen von Quelle und Ziel. Die Zieladdresse ist mir bekannt, da es sich um meinen angeschlossen Speicher handelt. Allerdings bekomme ich bei der Quelladresse ein Problem. Die Testdaten möchte ich mittels eines C-Programms generieren. Diese Daten liegen dann aber auf virtuellen Adressen, wie bekomme ich den Bogen zu den pyhsischen um den DMA mit den notwendigen INformationen zu versorgen. Mir ist klar das dies eigentlich die Aufgabe eines Treibers ist, dennoch möcht ich eine Treiberprogrammierung nach Möglichkeit umgehen. Über einige Codeschnipsel die eine physische Addresspage allokieren und sie danach mit daten beschreiben in C geschrieben wäre ich sehr dankbar. Viele Grüße Andreas
Welchen DMA-Controller meinst Du? Etwa den Onboard-Controller, der seit dem Ur-PC-Design unverändert in jedem PC herumdümpelt, den 8237? Der ist so abartig langsam, daß er praktisch nur für den Betrieb mit dem Diskettencontroller zusammen verwendet wurde. Oder meinst Du den Busmaster-DMA, den Deine PCI-Karte (ich vermute mal, daß Du das mit "angeschlossenem Speicher" meinst), zur Verfügung stellen muss?
Hallo, mein "angeschlossener Speicher" ist ein das über PCIe angebundenes FPGA-Design. Dieses beinhaltet einen DMA-Controller und den Speicher. MIt diesem DMA möchte ich an eine Adresse des Hauptspeichers greifen um von dort aus in den FPGA-Speicher zu kopieren. Viele Grüße Andreas
Hi, welches OS? Doch nicht etwa DOS wie im Betreff? Bei allen NT-Versionen kommst Du um einen Treiber nicht herum, man kann nicht direkt von Ring 3 auf Ring 0 durchgreifen. Du musst doch irgendeinen Bridge-Chip zur Anbindung Deines "angeschlossenen" Speichers haben. PLX stellt viele dieser Bridges her. Die haben aber dafür auch Treiber, die SGA-DMA (Scatter-Gather-DMA) unterstützen und damit das ummappen und zusammenstückeln der Daten von Ring 0 auf Ring 3 übernehmen. Daten, die in Ring 0 noch zusammenhängen, müssen dies im virtuellen Adressraum eines Ring 3-Prozesses keineswegs tun und umgekehrt. Gruß, Oliver
Im Normalfall stellt dir der Treiber für dein PCIe Gerät auf Anfrage einen zusammenhängenden Block an physikalischem Kernel-Speicher zur Verfügung. Im User Space hast du da keine Chance. Ich hab das für den PLX 8311 mal gemacht, da kann man im Inf File auch angeben, wie groß der zu reservierende Speicher sein soll. Am Treiber fragt man dann mit dem API die Grüße und die physikalische Adresse an. Welchen Treiber nutzt du denn? Hoffentlich nicht den verbuggten Xilinx Treiber aus der PCIe Busmaster DMA Appnote?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.