Hallo, wir entwickeln eine PCIe-Hardware. Diese soll unter anderem Daten in den RAM des Hauptprozessors schreiben. Ich bin jetzt gerade dabei ein Testprogramm unter Linux zu schreiben. Ich stelle es mir so vor, dass ich einen Speicherbereich anfordere, diesen locke, die physikalische Adresse des Bereichs ermittele und an die PCIe-Karte übertrage. Mein Problem ist gegenwärtig, dass der angeforderte Speicher virtuell ist und nicht physikalisch auf der Adresse liegt, die mir z.B. malloc liefert. Wie kann ich aus einer Anwendung (als root, ist ja nur für Testzwecke) physikalischen Speicher bekommen und dessen Adresse? Danke Tom
Hmm, vielleicht über einen Kerneltreiber als Modul?
Ein früherer Kollege hat das über einen Kernelpatch gemacht. Der Speicherbereich wurde vor dem booten des Kernels reserviert und dem Kernel als reservierter Bereich übergeben.
Thomas Reinemann schrieb: > Wie kann ich aus einer Anwendung (als root, ist ja nur für Testzwecke) > physikalischen Speicher bekommen und dessen Adresse? Auf regulärem Weg in traditionellem Betriebssystemumfeld überhaupt nicht. Dazu bedurfte es eines device drivers. Allerdings gibt es in neuerer Zeit eine Entwicklung hin zu user space device drivers, also Treibern die nicht im Kernel Kontext laufen, sondern vergleichbar zu Anwendungen. Könnte sich lohnen, mal in dieser Richtung zu suchen.
Und das bezieht sich wie gefragt auf Anwendungsebene??? Nope, das steht ja auch drüber. Das beschreibt Kernel-Code, also Treiber-Programmierung.
Tja, was du tun willst fällt halt nun nicht in den Aufgabenbereich von User-Space-Applications, sondern ist Aufgabe des Kernels. "bla" hat schon recht mit dem Link. Schließlich hantiert man in Software mit virtuellen Adressen und die Hardware mit physikalischen Adressen. Also muss man das umsetzen.
Einige Linux-Systeme bieten ein spezielles Memory-Device (/dev/mem), worüber man direkt auf den physkalischen Speicher aus dem User-Space zugreifen kann. Siehe http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel9a.shtml#9_4 Auf dauer sollte man das ganze aber trotzdem über einen eigenen Device-Driver realisieren, der der Anwendung nur die benötigten Daten liefert und sich um den Speicher selbst kümmert. Dafür sind Treiber da. MfG Mark
Mit /dev/mem kommt man zwar an den physikalischen Speicher ran, sein Problem besteht aber darin, solchen überhaupt erst mal zu kriegen, d.h. die physikalische Adresse eines DMA-fähigen Speicherbereichs. Das ist ohne Treiber nicht drin.
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.