Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32155
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 35
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-14 14:39
文章分类
文章存档

2014年(2)

2013年(12)

我的朋友

分类: 嵌入式

2013-03-19 16:34:54

原文地址:UBIFS文件系统的移植 作者:飘之叶

 

作者:piaozhiye86@126.com

首次做UBIFS的移植,不足之处欢迎批评指正。

2010-7-15

 

 

自从linux2.6.27以后的内核版本都支持UBI文件系统了,新版本的uboot已经支持UBIFS了。

软件平台

VMware

Fedora-10

使用源码:

linux-2.6.30.4.tar.bz2

u-boot-2010.06-rc1.tar.bz2

硬件环境mini2440—64M NAND

关于uboot的移植可以参考 《嵌入式Linux之我行》 uboot的移植,那里写得比较详细。我也是参考了其中的文章。

 

1、  ubootUBI的移植

 

关于ubootUBI的移植几乎没有说明介绍,

移植首先要保证你的flash驱动能够跑起来,我是在nand flash 上跑的UBI

刚开始的时候我也没有什么头绪,只能够从ubootreadme开始查找一些蛛丝马迹。

 

- MTD Support (mtdparts command, UBI support)

              CONFIG_MTD_DEVICE

 

              Adds the MTD device infrastructure from the Linux kernel.

              Needed for mtdparts command support.

 

              CONFIG_MTD_PARTITIONS

 

              Adds the MTD partitioning infrastructure from the Linux

              kernel. Needed for UBI support.

 

因此呢,要UBI支持首先得要MTD支持,因此在配置文件中要添加以上两项的定义。

要移植UBI还要添加:

#define CONFIG_CMD_UBIFS           

#define CONFIG_CMD_UBI         

 

总的关于UBI的部分是以下几个宏

/****MTD Support (mtdparts command, UBI support)****/

#if 1

#define CONFIG_MTD_DEVICE          1

#define CONFIG_MTD_PARTITIONS        1

#define CONFIG_CMD_MTDPARTS         

#define CONFIG_CMD_UBIFS           

#define CONFIG_CMD_UBI         

#define CONFIG_LZO                    1

#define CONFIG_RBTREE                    1

#endif

 

 

 

 

同时呢要给NAND建立个默认的分区。方便以后操作。我的分区如下:

 

#define MTDIDS_DEFAULT                  "nand0=nandflash0"

 

 

#define MTDPARTS_DEFAULT            "mtdparts=nandflash0:320k@0(uboot)," \

                                   "64k(params)," \

                                   "2m(kernel)," \

                                   "-(root)"

 

需要注意的是增加UBI的支持之后uboot会增大到260KB,在NAND中启动,需要修改

 

 

//copy U-Boot to RAM

ldr r0, =TEXT_BASE  //传递给C代码的第一个参数:u-bootRAM中的起始地址

mov r1, #0x0         //传递给C代码的第二个参数:Nand Flash的起始地址

mov r2, #0x50000    //传递给C代码的第三个参数:u-boot的长度大小(320KB)

bl nand_read_ll    //此处调用C代码中读Nand的函数,现在还没有要自己编写实现

 

如果uboot传给nand_read_ll uboot的参数小于uboot的长度的话,uboot跑不起来,移植的时候被这个问题搞得很郁闷。

另外还有一个地方就是编译的时要求CONFIG_SYS_MALLOC_LEN大于等于512KB,下面两个没有要求我也给改了。

#define CONFIG_SYS_MALLOC_LEN             (CONFIG_ENV_SIZE+  512*1024)

#define CONFIG_SYS_GBL_DATA_SIZE   512 /* size in bytes reserved for initial data */

#define CONFIG_STACKSIZE      (512*1024)   /* regular stack */

如果没改的话会报错。

 

 

这个时候就可以make 了,如果顺利的话会编译出uboot-bin在根目录下。

再通过友善提供的vivi  a命令下载到nand 中,启动如下:

 

U-Boot 2010.06-rc1 (Jul 15 2010 - 16:48:33)

DRAM:  64 MiB

Flash: 2 MiB

NAND:  64 MiB

*** Warning - bad CRC or NAND, using default environment

In:    serial

Out:   serial

 

Err:   serial

Net:   dm9000

Hit any key to stop autoboot:  0

相关的ubi命令如下:

到这里ubootUBI移植完成了。

 

2. 第二步是内核对UBI的支持

linux-2.6.30.4的内核已经包含UBI

   1)Device Drivers  --->Memory Technology Device (MTD) support  --->UBI - Unsorted block images  --->Enable UBI

   2)File systems  --->Miscellaneous filesystems  --->UBIFS file system support

这样我们的内核就支持UBIFS文件系统了

 

3. UBIFS工具的编译

 

我是将ubifs直接作为根文件系统挂载的,需要mkfs.ubifs这个工具我是从git直接下载的最新版的mtd-utils,同时编译mtd-utils还需要两个库。

lzo-2.03zlib-1.2.3 下载完之后就直接按照默认的方式make

注意:我们是在x86平台上将rootfs文件系统打包成UBIFS格式的因此呢不能够修改编译工具。

最后在mkfs.ubifs目录下生产mkfs.ubifs

mkfs.ubifs的使用相关参数,照着它的Examples使用就可以了,具体参数的设置可以查看u-boot ubi分区时候所打印出来的参数。

Usage: mkfs.ubifs [OPTIONS] target

Make a UBIFS file system image from an existing directory tree

 

Examples:

Build file system from directory /opt/img, writting the result in the ubifs.img file

       mkfs.ubifs -m 512 -e 128KiB -c 100 -r /opt/img ubifs.img

The same, but writting directly to an UBI volume

       mkfs.ubifs -r /opt/img /dev/ubi0_0

Creating an empty UBIFS filesystem on an UBI volume

       mkfs.ubifs /dev/ubi0_0

rootfs打包成镜像:

./mtd-utils/mkfs.ubifs/mkfs.ubifs -m 512 -e 15872 -c 3944-r rootfs -o ubifs.img

 

 

Uboot传给内核的启动参数

#define CONFIG_BOOTARGS                   

"ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs console=ttySAC0 init=/linuxrc rw"

注意:因为还没找到原因挂载之后文件系统是只读的,所以就加了个rw,有人解决之后请联系我,不胜感激。

内核的默认启动参数和uboot传过来的是一样的。

 

4UBI的使用

 

1内核的烧写

 

tftp 0x32000000 zImage 将内核通过tftp下载到内存中

nand erase 0x60000 0x200000

nand write 0x32000000 0x60000 0x200000

 

2 文件系统的烧写

 

使用默认的分区对nand进行分区:mtdpart default

 

1)擦除root分区 nand erase root

 

2)对root分区进行ubi格式化 ubi part root

 

Creating 1 MTD partitions on "nand0":

 

0x26000033fc64f4-0x400000000000000 : ""

 

UBI: attaching mtd1 to ubi0

 

UBI: physical eraseblock size:   16384 bytes (16 KiB)

 

UBI: logical eraseblock size:    15872 bytes

 

UBI: smallest flash I/O unit:    512

 

UBI: sub-page size:              256

 

UBI: VID header offset:          256 (aligned 256)

 

UBI: data offset:                512

 

UBI: empty MTD device detected

 

UBI: create volume table (copy #1)

 

UBI: create volume table (copy #2)

 

UBI: attached mtd1 to ubi0

 

UBI: MTD device name:            "mtd=3"

 

UBI: MTD device size:            261993005056 MiB

 

UBI: number of good PEBs:        3944

 

UBI: number of bad PEBs:         0

 

UBI: max. allowed volumes:       92

 

UBI: wear-leveling threshold:    4096

 

UBI: number of internal volumes: 1

 

UBI: number of user volumes:     0

 

UBI: available PEBs:             3901

 

UBI: total number of reserved PEBs: 43

 

UBI: number of PEBs reserved for bad PEB handling: 39

 

UBI: max/mean erase counter: 1/0

 

3)创建rootfs    YH2440 # ubi create rootfs

 

 

YH2440 # ubi create rootfs

 

Creating dynamic volume rootfs of size 61916672

 

4)将文件系统下载到内存 tftp 0x32000000 ubifs.img

 

YH2440 # tftp ubifs.img

 

dm9000 i/o: 0x20000300, id: 0x90000a46

 

DM9000: running in 16 bit mode

 

MAC: 08:00:3e:26:0a:5b

 

could not establish link

 

Using dm9000 device

 

TFTP from server 192.168.1.80; our IP address is 192.168.1.252

 

Filename 'ubifs.img'.

 

Load address: 0x32000000

 

Loading: #################################################################

 

        #################################################################

 

        #################################################################

 

        ####################################

 

done

 

Bytes transferred = 3380736 (339600 hex)

 

5)将文件系统烧写到rootfs YH2440 # ubi write 0x32000000 rootfs 0x339600

 

YH2440 # ubi write 0x32000000 rootfs 0x339600

 

Volume "rootfs" found at volume id 0

 

之后启动就可以看到UBIFS可以运行了。

YH2440 # boot

 

 

NAND read: device 0 offset 0x60000, size 0x200000

 

 2097152 bytes read: OK

 

## Starting application at 0x32000000 ...

 

Uncompressing Linux............................................................................................................................... done, booting the kernel.

Linux version 2.6.30.4 (root@luoxiaotan.org) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ) #11 Wed Jul 14 16:24:33 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177

CPU: VIVT data cache, VIVT instruction cache

Machine: S3C2440

Warning: bad configuration page, trying to continue

Memory policy: ECC disabled, Data cache writeback

CPU S3C2440A (id 0x32440001)

S3C24XX Clocks, (c) 2004 Simtec Electronics

S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz

CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

Built 1 zonelists in Zone order, mobility grouping off.  Total pages: 4064

Kernel command line: ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs console=ttySAC0 init=/linuxrc rw

NR_IRQS:85

irq: clearing subpending status 00000003

irq: clearing subpending status 00000002

PID hash table entries: 64 (order: 6, 256 bytes)

Console: colour dummy device 80x30

console [ttySAC0] enabled

Dentry cache hash table entries: 2048 (order: 1, 8192 bytes)

Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)

Memory: 16MB = 16MB total

Memory: 12076KB available (3UBIFS: mounted UBI device 0, volume 0, name "rootfs"

UBIFS: file system size:   61456384 bytes (60016 KiB, 58 MiB, 3872 LEBs)

UBIFS: journal size:       8110592 bytes (7920 KiB, 7 MiB, 511 LEBs)

UBIFS: media format:       w4/r0 (latest is w4/r0)

UBIFS: default compressor: lzo

UBIFS: reserved for root:  0 bytes (0 KiB)

VFS: Mounted root (ubifs filesystem) on device 253:1.

Freeing init memory: 120K

 

Please press Enter to activate this console.

 

 

BusyBox v1.13.3 (2010-07-13 08:51:35 CST) built-in shell (ash)

Enter 'help' for a list of built-in commands.

 

 

 

阅读(208) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册