s3c2440 linux系统移植(四)使用ubi作为根文件系统

本文详细介绍了在嵌入式设备上通过U-Boot和Linux内核对NAND Flash进行分区的方法,包括配置U-Boot和内核以支持MTD、UBI和UBIFS文件系统,以及如何使用mkfs.ubifs工具生成rootfs映像并将其加载到NAND Flash。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先在uboot 里面对nand flash进行分区设置,源文件在/include/configs/smdk2440.h:

#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
#define MTDIDS_DEFAULT			"nand0=smdk2440-0"
/* Size must be a multiple of Nand erase size (524288 b) */
#define MTDPARTS_DEFAULT		"mtdparts=smdk2440-0:2m(uboot)," \
					"128k(u-boot-env)," \
					"4m(kernel),-(rootfs)"

-rootfs指的是后面的空间全部留给rootfs

如果制作的ubi 映像使用了压缩格式,还需要把下面的选项选上:

#define CONFIG_BZIP2
#define CONFIG_LZO
#define CONFIG_LZMA

然后修改内核文件,使得mtd分区表和uboot中的设置一致/arch/arm/mach-s3c24xx/smdk2440.h:

static struct mtd_partition smdk_default_nand_part[] = {
	[0] = {
		.name	= "uboot",
		.size	= SZ_2M,
		.offset	= 0,
	},
	[1] = {
		.name	= "u-boot-env",
		.offset = SZ_2M,
		.size	= SZ_128K,
	},
	[2] = {
		.name	= "kernel",
		.offset = SZ_128K+SZ_2M,
		.size	= SZ_4M,
	},
	[3] = {
		.name	= "rootfs",
		.offset	= SZ_128K+SZ_2M+SZ_4M,
		.size	= MTDPART_SIZ_FULL,
	}
};

然后配置linux kernel,把前面设置的initramfs的根目录设置为空,并且把内核mtd和ubi 文件系统相关的选项都选上。

然后设置 uboot的启动参数,rw是以可读可写方式挂载文件系统,如果不设置,默认采用只读方式挂载

set bootargs console=ttySAC0,115200 ubi.mtd=3 root=ubi0:rootfs rw rootfstype=ubifs

制作ubi img:

mkfs.ubifs  -r rootfs -m 2048 -e 126KiB -c 2048 -o rootfs.img

这边具体参数的含义说明一下,如果ubi 挂载不成功,多半是参数设置不对。

先看一下我这边nandflash的参数图:

-m 最小 I/O 单元大小,一般是页大小, 是2K,2048
-r 是指定哪个文件系统作为文件系统。
-e 是可擦除逻辑块大小,一般等于 (每块的页数 - 2)* 页大小 = 126K
-c 是最大可擦除逻辑块总数,这边总共是2048
-o 生成的 ubifs.img
如果这边参数设置不对,在linux挂载根文件系统的过程中也会出现相应的错误提示:

网上有些资料设置-e 为124KiB,结果会出现如下错误:

可以看到,会提示real size,应该使用126KiB。

现在可以开始把ubi映像加载到nand flash了。

1 在uboot 中使用 mtdparts指令,可以看到分区信息:

2 然后使用nand erase.part rootfs 命令,擦除rootfs 块,为写入做准备。

3  ubi part rootfs 512

attach ubi,并且使用rootfs 分区,后面带的512这个参数很重要,这个是ubi vid header,就是上图nand flash 结构里面sub page的大小,64B,等于512b,比较奇怪的是,使用2048大小时,在uboot 里面可以使用ubifsmount ubi0:rootfs 挂载成功,但是在kernel 里面加载的时候就会报错:

可以看到,kernel 希望传入的是512.

当执行完ubi part命令以后,uboot 会show 出一些nand flash的信息,这些信息如果不看nand flash 结构图,对于使用mkfs.ubifs 工具生成rootfs 映像文件也是有帮助的:

4 ubi create rootfs 生成ubi 卷,按理说格式正确的话使用 ubifsmount ubi0:rootfs 可以挂载成功,但是这边使用512 attach分区的情况下失败了,没有深究

5 tftpboot rootfs.img 把rootfs映像下载到ram中,地址为0x31000000,

ubi write 0x31000000 rootfs  size    把ram中的数据写到ubi 卷中。

tftpboot uImage下载kernel,bootm 0x31000000,启动内核,可以看到,内核挂载根文件系统成功:

下面贴一个链接,讲解了如何设置了ubi part rootfs 参数,并且列举了一些ubi 挂载过程中使用错误的参数会导致的问题:

https://blog.youkuaiyun.com/ee230/article/details/50069949

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值