Tweet

フラッシュ ROM メモリマップ

まずはフラッシュ ROM のメモリマップ. linux/drivers/mtd/maps/redwood.c から読み取ることができる. フラッシュ ROM は,0xff800000 から 8MB の領域に割り当てられている.

下記オフセットは,フラッシュ ROM の先頭アドレスからのオフセット.

devoffsetsizeerasesizename
mtd00x000000000x000100000x00002000"OpenBlockS Configuration Data"
mtd10x000100000x007b00000x00010000"OpenBlockS Boot Image"
mtd20x007c00000x000400000x00010000"OpenBlockS OpenBIOS"

ブートストラップ

まずは,電源オン(リセット)〜 OpenBIOS の起動まで.

PPC405GPr のユーザマニュアル 3.2.1 Physical Address Map では,

Peripheral Bus Boot 1 0xFFE00000 0xFFFFFFFF 2MB

とある.先の MTD デバイスのブートローダの領域と見比べると,一致しない.あれれ.

が,8.10 PPC405GPr Initial Processor Sequencing に,説明があった

  • 2MB,というのは,リセット時に初期化されてアクセス可能な領域
  • リセット直後は 0xFFFFFFFC から実行を開始
  • この領域にジャンプ命令を書いておく

ことだそうだ. これはかしこい. これだと,MIPS みたいにブートローダで Flash ROM 領域が泣き別れ,ということがない.

OpenBlockS では

以下のようにし,ディスアセンブル.

# cat /dev/mtdblock2 > openbios
# objdump -D -EB -b binary -m powerpc:403 -M power4 --adjust-vma=0xfffc0000 openbios

クロス開発環境の場合,objdump の部分は適宜読みかえること.

すると,

   fffe2020:   38 80 00 00     li      r4,0
   ...
   fffffffc:   4b fe 20 24     b       0xfffe2020

という結果が得られる.

つまり

  1. 0xffffffc の命令を実行
    0xfffe2020 へジャンプ
  2. 0xfffe2020 から,OpenBIOS の実行が始まる

ということがわかる.

OpenBIOS

IBM 謹製のブートローダ. Open という名前に反して,オープンソースではない.

オープンソースどころか,使用法の説明すらオープンではないようである. これはちょっとつらい.

Linux の起動

OpenBIOS から起動される. ここで問題となるのは,Linux カーネルの形式.

OpenBIOS で扱うターゲットブートファイルの形式を,ここでは仮に treeboot 形式と呼ぶことにする.

treeboot 形式のファイルは,elf 形式のファイルより mktree プログラム(linux-2.4.20/arch/ppc/boot/utils/mktree.c) により生成される. このプログラムで定義されている treeboot 形式ファイルのヘッダは以下の通り.

   typedef struct boot_block {
                   unsigned long bb_magic; /* 0x0052504F */
                   unsigned long bb_dest; /* Target address of the image */
                   unsigned long bb_num_512blocks; /* Size, rounded-up, in 512 byte blks */
                   unsigned long bb_debug_flag; /* Run debugger or image after load */
                   unsigned long bb_entry_point; /* The image address to start */
                   unsigned long bb_checksum; /* 32 bit checksum including header */
                   unsigned long reserved[2];
   } boot_block_t;

linux-2.4.20/arch/ppc/boot/simple/head.S の定義.

   start:
                   bl start_
   #ifdef CONFIG_IBM_OPENBIOS
                   /* The IBM OpenBIOS bootroms know that the address of the bootrom
                     * read only structure is 4 bytes after _start.
                     */
                   .long 0x62726f6d # structure ID - "brom"
                   .long 0x5f726f00 # - "_ro\0"
                   .long 1 # structure version
                   .long bootrom_cmdline # address of *bootrom_cmdline
   #endif

これも「ヘッダの一部」と言えるかもしれない.

で,カーネルコンパイル後に生成される linux-2.4.20/arch/ppc/boot/images/zImage.treeboot をダンプしてみると,たしかにこの通りの形式になっている.

   0000000 5200 4f50 5000 0000 0000 7407 0000 0000
   0000020 5000 0000 e1e4 f2d6 0000 0000 0000 0000
   0000040 0048 1500 7262 6d6f 725f 006f 0000 0100
   0000060 4000 804c 687c a602 6338 fcff 0048 0400
   0000100 687c 781b 8b7c 7823 803c 4000 8460 0000
   0000120 a03c 4e00 a560 f801 a538 0300 a47c 5028
   0000140 a554 bef0 a77c 782b 037c 0020 8241 9c00
   0000160 803c 4000 8460 0000 a03c 4e00 a560 f801
   0000200 c47c 5028 c87c 1432 057c 0030 8141 0800
   0000220 0048 0800 a67c 782b c638 0400 a038 0300

あ,ダンプは x86 上でやっているので,バイトオーダが入れ替わっています.注意.

一方,OpenBlockS266 上で /dev/mtdblock1 をダンプしてみると,

   0000000 0052 504f 0050 0000 0000 0774 0000 0000
   0000020 0050 0000 e4e1 d6f2 0000 0000 0000 0000
   0000040 4800 0015 6272 6f6d 5f72 6f00 0000 0001
   0000060 0040 4c80 7c68 02a6 3863 fffc 4800 0004
   0000100 7c68 1b78 7c8b 2378 3c80 0040 6084 0000
   0000120 3ca0 004e 60a5 01f8 38a5 0003 7ca4 2850
   0000140 54a5 f0be 7ca7 2b78 7c03 2000 4182 009c
   0000160 3c80 0040 6084 0000 3ca0 004e 60a5 01f8
   0000200 7cc4 2850 7cc8 3214 7c05 3000 4181 0008
   0000220 4800 0008 7ca6 2b78 38c6 0004 38a0 0003

となっている. 先ほどの zImage.treeboot が先頭からべた書きになっていることがわかる.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-17 (月) 00:33:41 (3075d)