Zynq DeviceTree Memory einschränken

Gast #4861154
Hallo,

ich arbeite hier mit einem Xilinx Zynq und würde per Device-Tree gerne 
die Memory einschränken, damit von dem 512 MB DDR Ram auf dem Board hier 
nur 384 MB benutzt werden.

Ich will die oberen 128 MB für FPGA-Ram nutzen um Hardwarebeschleuniger 
damit arbeiten zu lassen, soll aber genauso per mmap erreichbar sein.


Ich habe den Tipp bekommen, dass ich dem Linux irgendwie vorgeben kann 
nur einen gewissen Bereich des Rams zu nutzen.


include "zynq-7000.dtsi"

/ {
  cpus {
    cpu@0 {
      operating-points = <650000 1000000 325000 1000000>;
    };
  };
  chosen {
    bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk 
rootfstype=ext4 rootwait devtmpfs.mount=1";
  };
  aliases {
    ethernet0 = &gem0;
    serial0 = &uart0;
    spi0 = &qspi;
  };
  memory {
    device_type = "memory";
    reg = <0x0 0x20000000>;
  };
};



Wie man sieht ist bei der memory definiert, dass ab Adresse 0 512 MB zur 
Verfügung stehen.
Ich habe probiert bei Reg den zweiten Parameter einmal auf 0x18000000 zu 
setzen, aber dann läuft der Linux Kernel nicht mehr hoch.
Die letzte Meldung die dann per Uart rauskommt ist "Starting Kernel..."
Sobald ich auf 0x20000000 zurücksetze geht alles.

Danke.
Gast
Für alle, die irgendwann vor dem gleichen Problem stehen:

Das Problem ist, dass U-Boot die ganze Zeit noch konfiguriert war, dass 
er den Device-Tree ziemlich ans Ende der 512 MB kopiert.

Nachdem Linux dann eingeschränkt wurde auf 256 MB konnte es den eigenen 
Device-Tree nicht mehr finden und hat deshalb nicht mehr gebootet.

Es gibt in U-Boot die Option "fdt_high". Dort kann man die High-Adresse 
einstellen, die beim kopieren des DeviceTrees nicht überschritten werden 
darf.

Dann hat alles geklappt.
Den Kernel per "mem=384M" einzuschränken, um den Speicher anderweitig zu 
benutzen, ist ein eher schlechter Stil. Irgendwann wirst du 
(versehentlich) deine Hardware mit einem Standardkernel benutzen und 
stillen Datenverlust erleiden (kann jede Datei treffen, die mit mmap() 
geöffnet wurde).

Sorge lieber dafür, dass der Kernel diesen Speicherbereich kennt und 
bewusst nicht anfasst. Es gibt z.B. den CMA (Continuous Memory 
Allocator), der mit dem DMA-System zusammenarbeitet, was für deine 
Hardware u.U. ganz nützlich sein kann (wenn sie denn mit dem Linux 
kommunizieren sollen). Braucht aber einen Kernel-Treiber.

Wenn du das nicht willst, dann blockiere lieber deinen gewünschten 
Adressbereich im Device-Tree gezielt mit einer "/reserved-memory"-Node. 
Dann kannst du dem Block sogar einen Namen geben, den dein Programm 
später nutzen kann. Die Dokumentation dazu gibt's hier: 
https://www.kernel.org/doc/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.