Ramdisk サイズの変更


メインメモリ確保のため ramdisk を無くす。... 前に色々とやっておくことがある。それも山ほど sigh.

メモリマップ

SL-A300 の RAM は以下のようになっている。

+------------+---------------------------+
| 0xa0000000 |  RAM バンク 0 開始。      |
|            |                           |
|  (32 MB)   |                           |          
|            |                           |
|            |                           |
| 0xa1ffffff |  RAM バンク 0 終了。      |
+------------+---------------------------+
| 0xa2000000 |                           |
|            |   空き                    |
| 0xa3ffffff |                           |
+------------+---------------------------+
| 0xa4000000 |  RAM バンク 1 開始。      |
|  (4 MB)    |                           |
| 0xa43fffff |  メインメモリエリア終了。 |
+------------+---------------------------+
| 0xa4400000 |  ラムディスクエリア開始。 |
|  (28MB)    |                           |
|            |                           |
| 0xa5ffffff |  RAM バンク 1 終了。      |
+------------+---------------------------+

RAM は二つのバンクに分かれ、バンク 1 の後側 28MB が /dev/mtdblock1 になっている。 ということはつまり /dev/mtdblock1 は 32MB を越えられないが、 ... 実用上、28MB から減らすことはあっても増やすことはなかろ。

ラムディスクエリアを規定するのは kernel config 中の

CONFIG_MTDRAM_SABINAL_TOTAL_SIZE=28672
CONFIG_MTDRAM_SABINAL_ERASE_SIZE=1
CONFIG_MTDRAM_SABINAL_ABS_POS=A4400000
で、ラムディスクエリアの開始とサイズを指定する。

さらに、この領域を固定した仮想アドレスに貼りつけているのが arch/arm/mach-cotulla/mm.cdiscovery_init() 中の:

 { 0xf9000000, 0xa4000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Special case */
バンク 1 の全領域を仮想アドレス 0xf9000000〜 に貼りつけている。 そのついでに CPU の data cache を外している、んだと思う。 "DOMAIN_IO" の指定で ... ramdisk から data cache を外すほうが良いのかと言われると、 確かにそんな気もしないでもない。
IO 領域としてはこれで必要十分のはずだが ── とかだったらどうしよう ... BIOS 領域も DOMAIN_IO 指定してるから大丈夫かな。

固定した仮想アドレスに張り付けているのは、 おそらくリセットを跨いで ramdisk を保全するため ... だと思うんだが、 べつにリセットの前後で異なる仮想アドレスにマップされても ramdisk として整合するような気はする。よくわからん。

一方、メインメモリエリアを規定するのは、カーネルソース arch/arm/mach-cotulla/arch.cfixup_cotulla() 関数:

  mi->bank[0].start = PHYS_OFFSET;
  mi->bank[0].size  = (32*1024*1024);
  mi->bank[0].node  = 0;

  mi->bank[1].start = 0xa4000000;
  mi->bank[1].size  = (4*1024*1024);
  mi->bank[1].node  = 0;
  mi->nr_banks      = 2;

bank[0], bank[1] がそれぞれバンク 0, 1 でメインメモリとして使う部分に対応する ... というか、 このソース見てメモリマップ描いたんだけども。 ところでこれ、カーネル 2.4 でメモリホールがあっても使えるようになったというあたりのコードやね。 いきなりベタ書きしてるけど。

ラムディスクサイズの変更

よって、ラムディスクのサイズを変えるには少なくとも 3 箇所を変える。 kernel config 中の 及び arch/arm/mach-cotulla/arch.c ついでに arch/arm/mach-cotulla/mm.c から ただ、最後のは触らなくても問題は起きない。たぶん :-)

実験的に 最初の 3 つを

CONFIG_MTDRAM_SABINAL_TOTAL_SIZE=16384
CONFIG_MTDRAM_SABINAL_ABS_POS=A5000000
mi->bank[1].size = (16*1024*1024);
としたケース (mm.c は触ってない) が:
Memory 48MB Ramdisk 16MB

というわけで、ラムディスクは 16MB に、メインメモリは 48MB になった。

なお、この「システム情報」は qtopia-free のものに差し替えられている。 こっちのほうが Embedix 産のやつより詳しい。


[日記へ] [目次へ] e