2005-09-24 (土)
- 天気:曇り
今日は近くの神社のお祭りのようで外が賑やかです.
*Linux on BBR-4MG フラッシュメモリから起動
今日はフラッシュメモリからの起動に挑戦.tftp経由で/dev/mtd〜に書き込み.カーネルの本体は起動用のコードをバイナリエディタで付け加えて(ぇ?),gzipで圧縮して,元のファームウェアに上書き.
決められたアドレスにカーネルを配置してジャンプさせるコードが必要なことに気付いたけど,再起動するのが面倒だったので,Windows上で書くことに.Windows上で動くMIPSアセンブラは無いのかと思って少し探したのですが,見つからない.逆アセンブラはあるのに….たった60バイトのプログラムですが,書くのに30分近くかかりました(笑).
__rd_startを参照している場所を探すと,ポインタをグローバル変数のinitrd_startに代入している.とりあえず,arch/mips/am5120/prom.cでinitrd_startとinitrd_endをフラッシュメモリ上のデータのアドレスに書き換え.kernel/setup.cの中でメモリの範囲をチェックしているような….実行してみるとやっぱり,「initrd extends beyond end of memory」とか言われました.
initrdのRAMディスクのイメージに任意のアドレスを指定する方法はないのかなぁ.ソースを読む限りカーネルの後ろの方に何か書いておくと,そこの設定を読んでくれそうなのだけど.どっちにしろ,RAMの範囲外にあるものは使えなさそうだけど….
というわけで,今度は,もっと後に呼ばれそうなinit/main.cの中に書いてみることにする.今度は,展開できる…っと思ったら展開した直後にpage_alloc.cの中でエラー.これも半ば予想通りだったので,rd.cの中でメモリを開放しようとしてるところをフラッシュメモリからの起動の時は呼ばないように.これで起動できました.
……絶対に何かが違います.もっと普通の方法で解決したいのだけど….とりあえず,再起動しても,ちゃんとLinuxが自動で起動します.
しばらく,怪しいながらもDHCPが動いていたのに,なぜかまったくパケットが返ってこなくなってしまった.何か消してはいけないものを消してしまったかな.
もしかして,動作にはCONFIG_UNIXが必要?ドメインソケットを使ってるのかなぁ.とりあえず有効にしたらまともに動いたけど,今度はまたカーネルサイズがオーバー気味.zipの圧縮率を上げたらギリギリ入りました.ソース見て解決できそうだったらまた外してしまおう….
気が向いたらWebサーバでも動かすかなぁ.ファイルシステムを別の領域に書き込むようにしたおかげで,こっちはかなり余裕ができました.まだまだ入ります.カーネルもモジュールを外に出して起動してから組み込んだほうが良いかもしれない.Linux上で作ったファイルは再起動すると消えるのでフラッシュメモリにバックアップする手段を考えたほうが良いかもしれない.フラッシュメモリ上に適当な領域作っておいてマウントするればいいか….
ってなわけで,そろそろBBR-4MG改造週間は終わりです(一週間も使ってしまった…)
*めんどい
コンピュータで何かするときって,6割の時間が人間とコンピュータのインターフェイスで消費されて,3割がコンピュータの反応を待っている時間で,実際に必要な時間って1割くらいだと思うのだけど.10年くらいしたら改善されているかな.