Erlaube partielle Speicherzuordnung von / dev / mem

1

Ich habe ein SoC-FPGA (DE0-Nano-Soc), das eine ARM-Cortex-A9-CPU mit einem Cyclone V-FPGA auf einem einzelnen Chip enthält. Die CPU hat Zugriff auf 1 GB DDR3-Speicher, das FPGA kann jedoch auch auf diesen Speicher zugreifen, um Daten gemeinsam zu nutzen.

Jetzt habe ich Linux so konfiguriert, dass nur 900 MB des gesamten Arbeitsspeichers mithilfe des Boot-Parameters angezeigt werden mem=900M. Auf diese Weise habe ich etwas RAM übrig, das Linux nicht berührt, das ich verwenden kann, um mit dem FPGA zu kommunizieren. Ich möchte diesen Teil des RAM mit schreiben /dev/mem. Ich erhalte eine Fehlermeldung, dass mir die Erlaubnis verweigert wurde, wenn ich die entsprechende Adresse speichere. Ich vermute, das liegt daran, dass mein Kernel die Adresse CONFIG_STRICT_DEVMEMfestgelegt hat.

Jetzt möchte ich das nicht wirklich deaktivieren, da ich wirklich nur an Adressen schreiben muss, die Linux nicht verwendet. Gibt es eine Möglichkeit, dem Linux-Kernel mitzuteilen, dass es in Ordnung ist, in diesen bestimmten Teil zu schreiben, aber der normale Speicher ist immer noch begrenzt?

John Smith
quelle

Antworten:

2

Ich habe folgendes gefunden: https://docs.pmem.io/getting-started-guide/creating-development-environments/linux-environments/linux-memmap

Vorausgesetzt, Sie haben einen ausreichend neuen Kernel, memmap=124!900sollte das Hinzufügen den gewünschten Speicher als verfügbar machen /dev/pmem0.

Es wird empfohlen, auch hinzuzufügen nokaslr, da sonst zufällige Systemfehler auftreten können. KASLR ist eine Sicherheitsfunktion, die die Ausnutzung des Kernels erschwert.

Obwohl dies für faszinierende Hacks verwendet wurde , kann ich es für Ihren Fall nicht empfehlen. Ich weiß nicht, wie ich die CPU-Caches im Vergleich zu Aktualisierungen vom FPGA (auch bekannt als DMA) verwalten soll. Und unser Rat bei anderen Fragen ist, dies nicht zu tun :-).


Es gibt auch eine andere Option, die die Frage jedoch nicht wie geschrieben beantwortet. Ich denke, Sie können mit booten iomem=relaxed, wenn Sie STRICT_DEVMEM vorübergehend deaktivieren möchten, ohne einen ganz neuen Kernel zu kompilieren.

sourcejedi
quelle
2
Am Ende werde ich einen Gerätetreiber schreiben, um den Zugriffsteil zu handhaben. Lese- / Schreibvorgänge vom FPGA in den RAM sind nicht kohärent, sodass die Verwendung der Schnittstelle / dev / mem ohnehin zu Problemen geführt hätte. Aber jetzt möchte ich nur die Schnittstelle von Linux und vom FPGA testen, damit ich weiß, dass dies alles richtig verdrahtet ist. Dann werde ich einen schönen Gerätetreiber machen :). Vielen Dank für die Beantwortung meiner Frage und den Hinweis auf relevante Materialien!
John Smith
1
Genau so, wie ein kurzer Kommentar memmap=900!124900 bei Versatz 124 reservieren würde memmap=124!900. Ich möchte 124 bei Versatz 900 reservieren, also wäre die richtige Option .
John Smith