Wenn Sie möchten, dass das Betriebssystem vollständig ignorieren, müssen Sie mit "memmap
" ein Speicherloch machen ." Siehe diese Referenz. Wenn Sie beispielsweise 512 MB an der 2-GB-Grenze haben möchten, können Sie "memmap=512M$2G
eingeben " in Ihrer Kernel-Befehlszeile.
Sie müssen Ihren dmesg
überprüfen um ein zusammenhängendes Loch zu finden, das Sie stehlen können, damit Sie nicht auf irgendwelche Geräte treten; das ist spezifisch für Ihr Motherboard + Ihre Karten.
Das ist nicht die empfohlene Vorgehensweise - siehe Warren Youngs Antwort für die richtige Vorgehensweise (Kerneltreiber + DMA). Ich beantworte genau die Frage, die Sie gestellt haben. Wenn Sie vorhaben, dies für Endbenutzer zu machen, werden sie hassen Sie, wenn Sie ihnen das antun... glauben 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 das $ maskiert wird. Es sollte eine einzige \
geben vor $
. Beispiel:
$ sudo -v
$ sudo grubby --update-kernel=ALL --args=memmap='128M\\$0x57EF0000'
$ sudo grubby --info $(sudo grubby --default-kernel) | grep memmap
args="ro crashkernel=auto ... memmap=128M\$0x57EF0000"
Was Sie verlangen, heißt DMA. Sie müssen einen Treiber schreiben, um diesen Speicher zu reservieren.
Ja, mir ist klar, dass Sie sagten, Sie wollten nicht, dass das Betriebssystem eingreift, und ein Treiber wird Teil des Betriebssystems, aber ohne eine Treiberreservierung glaubt der Kernel, dass der gesamte Speicher ihm gehört. (Es sei denn, Sie sagen dem Kernel, dass er den Speicherblock ignorieren soll, gemäß Aarons Antwort.)
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 wollen, ich habe die zweite Ausgabe des Kapitels an anderer Stelle online gefunden. Beachten Sie, dass die 2. Ausgabe jetzt über ein Jahrzehnt alt ist und herauskam, als Kernel 2.4 neu war. Seit diesen Tagen wurde viel am Speicherverwaltungs-Subsystem des Kernels gearbeitet, daher ist es möglicherweise nicht mehr sehr gut anwendbar.
Um einen Speicherblock vom Kernel in ARM-basiertem Linux zu reservieren, können Sie auch einen reserved-memory
verwenden Knoten in Ihrer Gerätebaumdatei (dts). In der Kernel-Dokumentation (siehe hier) gibt es ein Beispiel:
memory {
reg = <0x40000000 0x40000000>;
};
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
/* global autoconfigured region for contiguous allocations */
linux,cma {
compatible = "shared-dma-pool";
reusable;
size = <0x4000000>;
alignment = <0x2000>;
linux,cma-default;
};
display_reserved: [email protected] {
reg = <0x78000000 0x800000>;
};
multimedia_reserved: [email protected] {
compatible = "acme,multimedia-memory";
reg = <0x77000000 0x4000000>;
};
};