Random-Access-Memory, zu Deutsch, Speicher mit wahlfreiem/direktem Zugriff, Direktzugriffsspeicher, abgekürzt RAM, ist ein Informations-Speicher, der besonders bei Computern als Arbeitsspeicher Verwendung findet.
Besonderheiten bei den 4K-Boxen mit ARM-Prozessor
Der SoC von Broadcom, der in den 4K-Boxen von VU+ verbaut ist, zweigt einen Teil des Hauptspeichers für Audio-/Video-Buffering-Zwecke ab. Dieser Speicher steht dem Betriebssystem für andere Aufgaben nicht zur Verfügung und wird konsequent auch nicht mit den bekannten Tools angezeigt (free, cat /proc/meminfo, top, htop, ...).
Zum Beispiel wird für die Vu+ Solo 4k, in der 2 GB RAM verbaut sind, folgendes angezeigt:
# free -h total used free shared buff/cache available Mem: 887M 156M 94M 656K 637M 709M Swap: 0B 0B 0B
Dem vermeintlich fehlenden Speicher kommen wir in folgende Dateien und Ausgaben auf die Spur:
In /var/log/messages oder mit dem Befehl dmesg wird direkt beim Booten folgendes angezeigt (umgebrochen, um's lesbarer zu machen):
[ 0.000000] Memory: 892100K/2097152K available (5849K kernel code, 320K rwdata, 1904K rodata, 248K init, 184K bss, 1188668K reserved, 16384K cma-reserved, 671744K highmem)
Hier sieht man schon, dass von den 2GB (2097152K) der Box dem Linux nur knapp 1GB (892100K) zur Verfügung stehen. Mehr als die Hälfte (1188668K) sind reserviert, und zwar vom Chipsatz.
Verantwortlich dafür sind die Parameter, mit denen der Kernel initialisiert wird (direkt darüber, wieder umgebrochen):
[ 0.000000] Kernel command line: root=/dev/mmcblk0p4 rootwait rw rootflags=data=journal debug coherent_pool=2M bmem=633m@387m bmem=499m@2573m
Die beiden "bmem"-Parameter zwacken Speicher für den Broadcom-Chipsatz ab - es gibt dafür einen Treiber linux/drivers/soc/brcmstb/bmem.c, der diesen Parameter dafür auswertet. Im Code für diesen Treiber finden wir auch, was die Abkürzung "bmem" bedeutet:
/*********************************************************************** * BMEM (reserved A/V buffer memory) support ***********************************************************************/
Die Speicherbereiche sind unter /proc/iomem aufgeführt:
# cat /proc/iomem 00000000-3fffffff : System RAM 00008000-0079a7ff : Kernel code 007da000-0085861b : Kernel data 18300000-3fbfffff : bmem.0 80000000-bfffffff : System RAM a0d00000-bfffffff : bmem.1 ...
Noch ein wenig rechnen und wir erhalten:
- Der System RAM Bereich von 0x00000000 bis 0x3fffffff umfasst somit 1.073.741.824 Bytes - also 1GB.
- Der System RAM Bereich von 0x80000000 bis 0xbfffffff umfasst ebenfalls 1.073.741.824 Bytes - also 1GB.
- Der Bereich für bmem.0 umfasst 663.748.608 Bytes (633MB)
- Der Bereich für bmem.1 umfasst 523.239.424 Bytes (499MB)
Damit sollte das Geheimnis des fehlenden Speichers gelüftet sein.