Was Sie verlangen, heißt DMA. Sie müssen einen Treiber schreiben, um diesen Speicher zu reservieren.
Ja, mir ist klar, dass Sie gesagt haben, Sie wollten nicht, dass das Betriebssystem eingreift, und ein Treiber wird Teil des Betriebssystems, aber ohne eine Fahrerreservierung glaubt der Kernel, dass der gesamte Speicher dazu gehört. (Es sei denn, Sie weisen den Kernel an, den Speicherblock gemäß Aarons Antwort zu ignorieren.)
Kapitel 15 (PDF) von " Linux Device Drivers, 3 / e " von Rubini, Corbet und Kroah-Hartmann behandelt DMA und verwandte Themen.
Wenn Sie eine HTML-Version davon haben möchten, habe ich die zweite Ausgabe des Kapitels an einer anderen Stelle online gefunden. Beachten Sie, dass die 2. Ausgabe bereits über ein Jahrzehnt alt ist, nachdem Kernel 2.4 neu war. Das Speicherverwaltungs-Subsystem des Kernels wurde seit jenen Tagen vielfach überarbeitet, so dass es möglicherweise nicht mehr sehr gut funktioniert.
Wenn Sie möchten, dass das Betriebssystem es vollständig ignoriert, müssen Sie mit "
memmap
." Siehe diese Referenz . Wenn Sie beispielsweise 512 MB an der 2-GB-Grenze haben möchten, können Sie "memmap=512M$2G
" in die Kernel-Befehlszeile eingeben.Sie müssen Ihre überprüfen
dmesg
, um ein zusammenhängendes Loch zu finden, das gestohlen werden kann, damit Sie nicht auf Geräte treten. das ist spezifisch für dein Motherboard + Karten.Dies ist nicht die empfohlene Vorgehensweise. Informationen zur korrekten Vorgehensweise finden Sie in der Antwort von Warren Young (Kerneltreiber + DMA). Ich beantworte genau die Frage, die Sie gestellt haben. Wenn Sie vorhaben, dies für Endbenutzer zu machen, werden sie Sie hassen , wenn Sie ihnen dies antun ... Vertrauen Sie mir, das ist der einzige Grund, warum ich diese Antwort kannte.
Bearbeiten: Wenn Sie grub2 mit grubby verwenden (z. B. CentOS 7), müssen Sie sicherstellen, dass Sie das $ entkommen . Es sollte
\
vorher eine Single geben$
. Beispiel:quelle
uint8_t *ptr = 0x8000000
" mit meinem Beispiel raten ? Oder dass Segfault ... Huh, ich weiß es wirklich nicht. Wieder wusste ich die Antwort, weil ich ein Endbenutzer einer schlecht gestalteten PCI-Karte war, bei der ich manuell einen Puffer unterhalb der 4G-Marke zuweisen und dann einem Fahrer mitteilen musste, wo sich dieser Speicherplatz befand. Es ist möglicherweise nicht möglich, Userland.MMAP_FIXED | MMAP_ANON
. Ohne ein benutzerdefiniertes DMA-Gerät, mit dem ich hier spielen kann, kann ich nicht sagen, ob es tatsächlich das tut, was das OP wollte, aber meine CentOS-Box hat mir glücklich einen 8-MB-Block mit 512 MB gegeben, als ich diesmemmap=8M$512M
in GRUB sagte . Es erfordert nicht einmal root-Zugriff, wie ich befürchtet hatte. Aber selbst wenn dies das Richtige tut, werden Sie wahrscheinlich einen Treiber brauchen, um mit Interrupts und ähnlichem umzugehen.mmap()
die Seiten werden auf Null gesetzt, bevor der Userland-Code sie sehen kann. Dies geschieht aus Sicherheitsgründen, damit keine Daten von einem Prozess zum nächsten gelangen. Ein weiterer Grund für die Verwendung eines Treibers, da Sie möglicherweise den Inhalt des DMA-Puffers beim Laden des Treibers beibehalten müssen. Übrigens, der willkürlich lokalisiertemmap()
Aufruf ist auch ohne diememmap
Kernel-Boot-Option erfolgreich, zumindest solange noch niemand den Speicher verwendet, der sich dort befindet, wo Sie gefragt haben. Die Boot-Option erhöht zweifellos die Erfolgschancen, ist aber nicht zwingend erforderlich.Um einen Speicherblock aus dem Kernel in ARM-basiertem Linux zu reservieren, können Sie auch einen
reserved-memory
Knoten in Ihrer Gerätebaumdatei (dts) verwenden. In der Kernel-Dokumentation (siehe hier ) gibt es ein Beispiel:quelle
Geben Sie zuerst diesen Befehl ein, um Ihre aktuelle Einstellung zu überprüfen:
Um den eingestellten Wert zu ändern, bearbeiten Sie
/etc/sysctl.conf
. Suchen Sie nach der Zeile:Wenn es nicht vorhanden ist, erstellen Sie es (zusammen mit Ihrem gewünschten Wert). Folgende Werte sind akzeptabel:
8M ist äußerst konservativ; es kann bei 16m bequem sitzen. Wenn Sie den Wert geändert haben, führen Sie dies aus und es ist kein Neustart erforderlich:
quelle