GENMAI BSP からの 内蔵RAM化について

はじめまして

Shimaと申します。

GENMAI BSPを元に、kernelの機能を削減して、外部RAMのみで動作させています。

 RZ/A1 10Mbyte

 

一部のRAMが使用できなくなっていますが、このRAMを使用できるようにすることは可能でしょうか。

約4Mbyte

 

起動ログの抜粋

...

Memory: 10MB = 10MB total
Memory: 6696k/6696k available, 3544k reserved, 0K highmem

...

freeコマンドの実行結果

 

# free
total used free shared buffers
Mem: 6792 5720 1072 0 156
-/+ buffers: 5564 1228
Swap: 0 0 0

  • 外部RAMは内部RAMの誤記です。
  • ご使用になっている Linux BSP の種類やバージョンを教えていただけますか?

    1.  日本語サイトからダウンロードした Linux 3.8 ベースの BSP
    2. 英語サイトからダウンロードした Linux 3.14 ベースの BSP
    3. Github の renresas-rz プロジェクトからダウンロード(git clone)した BSP
      3.14 ベース、4.9 ベースのどちらですか?
    4. その他
  • pecteilis様

    ご連絡ありがとうございます。
    1. 日本語サイトからダウンロードした Linux 3.8 ベースの BSP
    です。
    展開したビルドしたフォルダは、「RZLSP_V3.0.0」
    その中にフォルダ「linux-3.8.13」が展開されていました。

    ご助言おまちしております。

    【補足】
    昨年の秋ごろから、GENMAIを使用して開発をしてきました。
    ターゲットに移植するまえに、GENMAI上で内蔵RAMにしたところ、気が付きました。
    その後、configを変える前から、実装されているSDRAM容量に対して、Linuxでfreeコマンドを実行した結果のtotalから除外されているRAM容量があることに気が付きました。
    現状のRAMでも、開発したアプリは動作していますが、スレッド起動時のスタック量を減らすなど、必要メモリを縮減する工夫をしています。
  • > その後、configを変える前から、実装されているSDRAM容量に対して、Linuxでfreeコマンドを
    > 実行した結果のtotalから除外されているRAM容量があることに気が付きました。

    Windows などと同様に、Linux も基本的には、ハードディスク (組込み機器だとフラッシュメモリや
    eMMC などの記憶デバイス) から、そのプログラム全体を主記憶である RAM にコピー(ロード)して
    RAM 上で実行されます。お尋ねの「totalから除外されているRAM容量」の
            10 MB - 6,792 kB = 10,240 kB - 6,792 kB = 3,448 kB

    約 4 MB は、Linux カーネルのコードやデータ(静的、動的)として使用済み/使用予約済みの
    領域サイズです。ですから、基本的には、使用できません。

    ただ、Linux カーネル(やアプリ)は、かなり贅沢に RAM を使用しますから、既に Shima さんも一部、
    実行されているように、色々な方法で使用する RAM の量を削減する工夫がされています。

    1. カーネルを eXecute-In-Place 実行にする。
      CPU のアドレス空間に直接マッピングすることが可能な記憶デバイスを使用している場合には、
      コードや定数データなどの書き込み(変更)が必要ない部分は、RAM にコピーして実行せずに、
      ROM をアドレス空間に直接マッピングして実行する。使用する RAM の削減効果は大きいが、
      (一般的に)カーネルの起動は速くなるが実行速度が低下する。

      現在、ご使用になっている 3.8 ベースのカーネルの場合、カーネルコンフィギュレーションで
      CONFIG_XIP_KERNEL を有効にすることで、カーネルを XIP 実行することが出来ます。
      但し、それだけですと、arch/arm/mm/proc-v7.S の __v7_setup にバグがあり、動作しま
      せんので、適当な方法でパッチを入手して修正してください。
      なお、この方法を採用される場合、基本的には、XIP 実行で実績がある 3.14 ベースの BSP に
      移行することをお勧めします。

    2. 不要なデータ領域を削減する
      カーネルのコンフィギュレーションや一部のソースを修正して、不要な/冗長なデータ領域を
      削減する。

      現在、ご使用になっている 3.8 ベースのカーネルの場合、申し訳ありませんが、適当な情報を
      持ち合わせておりません。但し、英語版サイトの "RZ Forum"→"Files - Linux" に、次のアプリ
      ケーションノートが登録されています。
              "AppNote: RZ/A1 XIP Linux RAM Optimizations"

      これは、3.14 ベースのカーネル用ですが、大半の情報は、3.8 ベースのカーネルでも適用可能
      ですから、よろしければ、ご利用ください。
  • 補足です。

    実行速度の点で XIP は難しいとしても、もし、Shima さんがカーネル(やアプリ)を ARM 命令を
    使用してコンパイルしているのなら、それを Thumb 命令を使用してコンパイルするように変更
    する (カーネルのコンフィギュレーションで "Compile the kernel in Thumb-2 mode" を選択して、
    CONFIG_THUMB2_KERNEL を有効にする) と、カーネル(やアプリ)のコードサイズが削減されて、
    それが占有していた RAM の削減になります。

    また、命令密度が向上することで、多くの場合には、実行速度も併せて向上します。

  • pecteilis様

    貴重な情報ありがとうございます。

    ソースは変更せず、configの変更をしたところ、800kバイト程度、削減することができました。
    これで、最低限の動作環境は整いました、ありがとうございます。

    結果を以下に示します。

    ■起動時ログ
    ...
    Memory: 10MB = 10MB total
    Memory: 7448k/7448k available, 2792k reserved, 0K highmem
    ...

    ■freeコマンド実行結果
    # free
    total used free shared buffers
    Mem: 7516 5704 1812 0 152
    -/+ buffers: 5552 1964
    Swap: 0 0 0
    #