Forum: Mikrocontroller und Digitale Elektronik Zynq DeviceTree Memory einschränken


von Markus (Gast)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

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.

von mops (Gast)


Lesenswert?

Man kann den DeviceTree auch direkt an's Kernel Image drankleben

von S. R. (svenska)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.