メインメモリ確保のため ramdisk を無くす。... 前に色々とやっておくことがある。それも山ほど sigh.
+------------+---------------------------+ | 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.c の discovery_init() 中の:
{ 0xf9000000, 0xa4000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Special case */
バンク 1 の全領域を仮想アドレス 0xf9000000〜 に貼りつけている。
そのついでに CPU の data cache を外している、んだと思う。 "DOMAIN_IO" の指定で ...
ramdisk から data cache を外すほうが良いのかと言われると、
確かにそんな気もしないでもない。固定した仮想アドレスに張り付けているのは、 おそらくリセットを跨いで ramdisk を保全するため ... だと思うんだが、 べつにリセットの前後で異なる仮想アドレスにマップされても ramdisk として整合するような気はする。よくわからん。
一方、メインメモリエリアを規定するのは、カーネルソース arch/arm/mach-cotulla/arch.c の fixup_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 つを
としたケース (mm.c は触ってない) が:CONFIG_MTDRAM_SABINAL_TOTAL_SIZE=16384 CONFIG_MTDRAM_SABINAL_ABS_POS=A5000000 mi->bank[1].size = (16*1024*1024);
というわけで、ラムディスクは 16MB に、メインメモリは 48MB になった。
なお、この「システム情報」は qtopia-free のものに差し替えられている。 こっちのほうが Embedix 産のやつより詳しい。
e