2011年8月29日月曜日

UBIFS とは?


  +-----------+      +-------------+          +-------------+
  |  YAFFS2   |      |    UBIFS    |          | FAT or EXT2 |        Filesystems
  +-----------+      +-------------+          +-------------+
      \                    |                    /       \
       \                   |                   /         \
        \                  |                  /           \
         \                 |    +-----------------+  +-----------------+
          \                |    | UBI Block Layer |  | MTD Block Layer |
           \               |    +-----------------+  +-----------------+
            \              |      /                    /
             \             |     /                    /
              \      +-------------+                 /
               \     |     UBI     |                /
                \    +-------------+               /
                 \          |                     /
         +-------------------------------------------+
         |                 MTD                       |
         +-------------------------------------------+
                            |
                  +--------------------+
                  |     nand_base.c    |
                  +--------------------+
                            |
                  +--------------------+
                  |     jz4740_nand.c  |
                  +--------------------+


jz47xx
のような組み込みチップで使っている NAND FLASH は、生の FLASH なので、ウェアレベリング機能などはない。そして、使う側から見て 普通の USB DISK に見える機能が見えていて FAT ファイルシステムが作れるようになっている。

その間に ウェアレベリングをする機能がないと、特定の ブロックばかり書き換えられて FLASH がすぐダメになってしまう。

ウェアレベリングをする機能を提供しているのが、どうも UBI Block Layer というもので、基盤の機能を提供するのが UBI

UBIFS
 は、内部で使われるファイルシステムで、UBIFS - UBI の二階層の構造。これとは別に YAFFS2 という FLASH 向けファイルシステムはいっている。( ちなみに Linux 有名な JFFS2 という FLASH 向けファイルシステムは、数 GB といった 大容量フラッシュを想定して設計されていないらしく、推奨していないようだ。)

どういう基準でどちらを使うのかよくわからないが、UBI Block Layer 必須のシステムなら UBIFS を使った方が整合性が良さそうな気がする。

ところで、Linux-2.6.32 だと UBIFS は標準でサポートされている。下位レイヤの UBI drivers/mtd/ubi にあるようだ。

さて、UBI とは、UBIFS というのは具体的にどんなものなのだろう? そして u-boot UBIFS からのブートを サポートしているのだろうか? 

カーネルの Documentation/filesystems/ubifs.txt があり、その翻訳 JFプロジェクトでされている。

ubifs.txt
によると さらに詳しい情報は、UBIFS - UBI File-System UBIFS FAQ and HOWTO のページになる。

とりあえず知りたいのは、オリジナルファームウェアの構造。UBIFS だと目星をつけたとして、どうやって中を見るのだろう?

FAQ
をみると、「How to extract files from an UBI/UBIFS image? というそのものズバリなエントリーがあって、


# Create an 256MiB emulated NAND flash with 2KiB NAND page size
# (you should see the new MTD device in /proc/mtd)
modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa \
                 third_id_byte=0x00 fourth_id_byte=0x15

# MTD is not LDM-enabled and udev does not create device
# MTD device nodes automatically, so create /dev/mtd0
# (we assume that you do not have other MTD devices)
mknod /dev/mtd0 c 90 0

# Copy the contents of your image to the emulated MTD device
dd if=ubi.img of=/dev/mtd0 bs=2048

# Load UBI module and attach mtd0
modprobe ubi mtd=0

#
Mount UBIFS
mount -t ubifs /dev/ubi0_0 /mnt/ubifs



と書いてある。要するに nandsim というカーネルモジュールが必要で それを使って実際に ubifs mount するということらしい。

さて、Vine-5.1 にこれらは入っているのだろうか? どうも UBIFS は、linux-2.6.27 で入って Vine-5.1 linux-2.6.27
ビルトしてくれていれば入っていることになる。

で、みてみると ...


drivers/mtd/nand/nandsym.ko
drivers/mtd/ubi/ubi.ko
fs/ubifs/ubifs.ko


嬉しいことにちゃんと入っている。

ちょっとこれで、ファームウェアの中が覗けるのかどうか、調べてみよう。

...
それ以前の問題として id_byte って何?という疑問が。

2GB 8bit
K9XXG08UXM のデータシートが入手できたので見てみたところ ...

 

  • 1st 0xec
  • 2nd 0xd5
  • 3rd 0x14
  • 4th 0xb6
  • 5th 0x74


5 つもあった。1st がベンダーID , 2nd がプロダクトID
3rd
は、チップのタイプ


bit 7  : cache program      - 0: Not support 1: support
bit 6  : interleave program - 0: Not support 1: support
bit 5-4 : 同時にプログラム可能なページ数  - 0:1 1:2 2:4 3:8
bit 3-2 : セルタイプ        - 0:SLC 1:MLC(2bit) 2:MLC(3bit)
bit 1-0 : 内部チップ数      - 0:1 1:2 2:4 3:8



0x14
なら 普通の MLC

4th
は、ページのサイズとか 消去ブロックサイズ。


bit 7   : アクセスタイム? 0:低速 1:高速(25ns)
bit 6   : ビット幅? 0:x8 1:x16
bit 5-4 : 消去ブロックサイズ 0:64KB 1:128KB 2:256KB 3:512KB
bit 3   : 0
bit 2   : 冗長データサイズ(512B あたり) - 0:8バイト 1:16バイト
bit 1-0 : ページサイズ 0:1KB 1:2KB 2:4KB 3:8KB



0xb6
だと 消去ブロックサイズ 512KB ページサイズ 4KB 。冗長データサイズは、4Kのページあたり 16x8 = 128B

5th
は、容量に関する情報


bit 6-4  : プレーンサイズ 0: 64Mb .. 4:1Gb 5:2Gb 6:4Gb 7:8Gb
bit 3-2 : プレーン数 0:1 1:2 2:4 3:8



0x74
なら 8Gbit x 2 16Gbit/2GB

それは良いのだがこのパラメータをそのまま入れたら nandsim 落ちてしまった。--- ううむ。

さらに ファームウェアは RAW データではないかも知れない。
先頭は確かに RAW データっぽいのだが、UBIFS magic が見つけられなかった。UBI magic も見つけられないし。

それに ... UBI はパーティション別に構築するものっぽい。

..
というわけで良くわからなく...

 

0 件のコメント:

コメントを投稿