FON ソーシャルルータ La Fonera のファームウェアは Linux であり、 RedBoot ブートローダ から起動される。 デフォルト状態の La Fonera では、 以下のように RedBoot がフラッシュメモリから Linux カーネルをロードして 自動起動する設定になっている。
== Executing boot script in 1.000 seconds - enter ^C to abort RedBoot> fis load -l vmlinux.bin.l7 Image loaded from 0x80041000-0x801ba000 RedBoot> exec Now booting linux kernel: Base address 0x80030000 Entry 0x80041000 Cmdline : (以下略)
fis (Flash Image System) は、 フラッシュメモリの読み書きを行なうためのコマンドである。
「fis load -l vmlinux.bin.l7」を実行することにより、 フラッシュメモリ内の「vmlinux.bin.l7」と名前をつけられた区画の内容を RAM へコピー (つまり load) する。
ところが、 fis load コマンドのマニュアルには、 「-l」オプションの記述がない。
Synopsis
fis load [-b load address] [-c ] [-d ] [name]
にもかかわらず、 La Fonera の RedBoot で fis コマンドのヘルプを表示させると、 「-l」オプションが指定できることが分かる。
RedBoot> fis help *** invalid 'fis' command: unrecognized command Usage: fis create -b <mem_base> -l <image_length> [-s <data_length>] [-f <flash_addr>] [-e <entry_point>] [-r <ram_addr>] [-n] <name> fis delete name fis erase -f <flash_addr> -l <length> fis free fis init [-f] fis list [-c] [-d] fis load [-d] [-l] [-b <memory_load_address>] [-c] name ← コレ fis write -f <flash_addr> -b <mem_base> -l <image_length>
一体この「-l」オプションとは何なのか?
というか、
そもそも「vmlinux.bin.l7」という名前の見慣れない拡張子「L7」とは何なのか?
(L7 というと Layer 7 くらいしか思いつかない... ^^;)
というわけで調べてみた。
「vmlinux.bin.l7」の内容と、 「fis load -l」コマンドによって 0x80041000 番地にロードされた内容を見比べると、 「vmlinux.bin.l7」はデータ圧縮を行なった形式であるように見える。 おそらく「-l」オプションは、 フラッシュメモリ上の圧縮データを展開して RAM へロードするための オプションなのだろう。 圧縮データを展開するオプションとして「fis load」コマンドには、 すでに「-d」(gzip 圧縮データを展開) があるにもかかわらず、 何故わざわざ gzip 以外の圧縮形式を使っているのか謎であるが、 おそらくはより圧縮率の高い圧縮形式を使いたかったのだろう。
gzip より圧縮率が高い圧縮形式で「7」といえば 「7-Zip」、 という (安直な ^^;) 連想をもとに、 とりあえず手元にあった lzma コマンドで展開を試みてみる。
% lzma d vmlinux.bin.l7 vmlinux.bin LZMA 4.43 Copyright (c) 1999-2006 Igor Pavlov 2006-06-04
ありゃ、あっさり展開できてしまった。 ちょっと拍子抜け。
展開した vmlinux.bin を TFTP サーバに置いて、 La Fonera に読み込ませて起動してみる:
RedBoot> load -r -b 0x80041000 vmlinux.bin Using default protocol (TFTP) Raw file loaded 0x80041000-0x8029aa37, assumed entry at 0x80041000 RedBoot> exec Now booting linux kernel: Base address 0x80030000 Entry 0x80041000 Cmdline : (以下略)
これで、TFTP サーバに置いた任意のカーネルを La Fonera で起動することが できるようになった。 フラッシュメモリに書込む必要がないので手軽にカーネルの入れ替えができる。
ちなみに、 「vmlinux.bin」は RAM 上にコピーして即実行 (RedBoot の exec コマンド) 可能であることから、 raw binary 形式 (つまりオブジェクトファイルから、 シンボル情報やリロケーション情報を取り除いたもの) であることが分かる。 つまり、「vmlinux.bin」の拡張子「bin」は「raw binary」の意味なのだろう。 vmlinux から raw binary 形式のファイル vmlinux.bin を得るには、 次のように objcopy コマンドを実行すればよい。
% mips-linux-uclibc-objcopy -O binary vmlinux vmlinux.bin