DOS C DMA Transfer Physical Memory

Gast #2851137
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
Persönliche Seite #2851176
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?
#2851302
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
#2853417
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren