Forum: PC-Programmierung DOS C DMA Transfer Physical Memory


von andreas (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von andreas (Gast)


Lesenswert?

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

von Oliver R. (superberti)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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
Noch kein Account? Hier anmelden.