[Armadillo:00785] Armadillo-9: bssを多く消費するkernelではboot不可?

SATO Yusuke email@hidden
2006年 1月 12日 (木) 22:34:12 JST


こんにちわ
佐藤(ゆ)と申します

初めて投稿します。

最近Armadillo-9のケースモデルを入手いたしまして、いろいろといじってい
るのですが、一点不可解な現象に遭遇してしまいました。アドバイスをいただ
けないでしょうか?

いま、カーネル2.6向けユーザランドである romfs-20051017-2.6.12.3-a9-1.img.gz
を書き込んだ Armadillo-9に対して、linux-2.6.12.3-a9-1.tar.gz をベース
に、自分の好みのパッチを当てたkernelを作成し、それでブートさせようと考
えています。 自分好みのパッチというのは、具体的には LIDS というもので
す(http://www.lids.org/)。

しかし、linux-2.6.12.3-a9-1.tar.gz にLIDS patchを当てると、常にbootで
きないkernelが作られてしまうことに気づきました。

具体的には、LIDSを有効にしたkernelでbootしようとすると、

Hermit-At v1.0.0 (armadillo9) compiled at 18:43:28, Sep 26 2005
hermit> b
Uncompressing  kernel...........................................................
............................done.
Uncompressing ramdisk...........................................................
................................................................................
....................................................................done.
Doing console=ttyAM0,115200
Doing mtdparts=armadillo9-nor:0x10000(bootloader)ro,0x170000(kernel),0x670000(us
erland),-(config)

ここでピタッと止まってしまいます。kernelの一番最初のprintkまで辿り着い
ていないような感じです。なお、純正のlinux-2.6.12.3-a9-1.bin.gz を書き
込んだ場合は、もちろん正常に起動します。


いろいろ調べてみたところ、どうも、.bssを使いすぎるとbootできないkernel
になるようなのです。たとえば、LIDS patchを当てていない、素のカーネルソー
スをベースに、(どのファイルでもいいんですがたとえば) kernel/printk.c の
冒頭に、
  volatile char this_is_dummy[1086500];
と追記すると、起動できないkernelになります。1086500ではなく、
  volatile char this_is_dummy[1086400];
か、あるいはもっと小さな配列にすると起動できますので、このあたりが閾値
のようです。

起動する場合のSystem.mapは、

-------------------------------------------------
c0014000 A swapper_pg_dir
c0018000 T __init_begin
...
c027e000 D __data_start
...
c02cf0d0 D _edata
c02cf0e0 B __bss_start
...
c02db51c B this_is_dummy
c03e48dc b logbuf_lock
...
c03ff000 B _end
-------------------------------------------------

となっています。起動しない場合は、

-------------------------------------------------
c0014000 A swapper_pg_dir
c0018000 T __init_begin
...
c027e000 D __data_start
...
c02cf0d0 D _edata
c02cf0e0 B __bss_start
...
c02db51c B this_is_dummy
c03e4940 b logbuf_lock
...
c03ff060 B _end
-------------------------------------------------

です。_end と __bss_start のアドレスの差は、
  起動する場合:   0x0012ff20
  起動しない場合: 0x0012ff80
ですね。

クロス開発環境としては
  binutils-arm-linux-2.15-6.i386.rpm
  cpp-3.4-arm-linux-3.4.3-13.i386.rpm
  g++-3.4-arm-linux-3.4.3-13.i386.rpm
  gcc-3.4-arm-linux-3.4.3-13.i386.rpm
  libc6-arm-cross-2.3.2.ds1-22.noarch.rpm
  libgcc1-arm-cross-3.4.3-13.noarch.rpm
  linux-kernel-headers-arm-cross-2.5.999_test7_bk-17.noarch.rpm
などを (CentOS4/x86上で) 使用しています。

LIDS側にbssの消費を抑えるような変更を加えることも可能ではありますが、
もし
・この現象が起きる原因
・この現象をArmadillo-9側でどうにか回避する方法
などがわかる方がいらっしゃいましたら、ぜひ教えてください。

よろしくお願いいたします。

--
SATO Yusuke / 佐藤 祐介 <email@hidden>




armadillo メーリングリストの案内