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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Markus (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Man kann den DeviceTree auch direkt an's Kernel Image drankleben

von S. R. (svenska)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.