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.
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.
Man kann den DeviceTree auch direkt an's Kernel Image drankleben
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.