ubifs文件系统的制作详解Word文件下载.docx
- 文档编号:22760688
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:66
- 大小:247.25KB
ubifs文件系统的制作详解Word文件下载.docx
《ubifs文件系统的制作详解Word文件下载.docx》由会员分享,可在线阅读,更多相关《ubifs文件系统的制作详解Word文件下载.docx(66页珍藏版)》请在冰豆网上搜索。
(注意:
不同的开发板在include/configs/目录下对应的修改的配置文件不同,我的开发板是mini2440所以修改的是mini2440.h)
#defineCONFIG_MTD_DEVICE
#defineCONFIG_MTD_PARTITIONS
#defineCONFIG_CMD_MTDPARTS
#defineCONFIG_LZO
#defineCONFIG_RBTREE
#defineCONFIG_CMD_UBIFS
//要支持ubIfs首先得让uboot支持UBIFS的烧写命令
#defineCONFIG_CMD_UBI
//uboo支持的ubifs烧写命令:
1.mtdparts:
用来给NAND分区;
/*2.nanderase.part:
用来擦除指定分区
等这些命令在“UBIFS镜像的制作&
烧写”博文理解*/
//其次要支持MTD(memorytechnologydevice内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统
#defineMTDIDS_DEFAULT"
nand0=nandflash0"
//同时要给nandlflash建立默认的分区,
#defineMTDPARTS_DEFAULT"
mtdparts=nandflash0:
384k(bootloader),"
\
//我的分区:
"
128k(params),"
\
"
5m(kernel),"
64m(root)"
/*还要修改下面几个宏,因为使用UBIFS会占用更多的堆、栈空间*/
#defineCONFIG_STACKSIZE(512*1024)
#defineCONFIG_SYS_MALLOC_LEN
(CONFIG_ENV_SIZE+1024*1024)
#defineCONFIG_SYS_GBL_DATA_SIZE
512
2.回到uboot的顶层目录下
(可能拿到的uboot已被编译过,所以最好要用此命令清理中间文件)
执行命令:
makeclean
(uboot是通用的bootloader,支持多种开发板,所以编译之前先选择使用哪种board)
makemini2440_config
注意:
我用的是mini2440开发板,所以要编译这个开发板使用的uboot,所以这里的目标为mini2440_config,表示选择的board是mini2440
(mini2440_config在Makefile标准术语称为“目标”,可以在uboot顶层Makefile找到该目标)
执行命令(开始编译uboot):
makeCROSS_COMPILE=arm-linux-
遇到的问题及解决方案总结---之二“Linux内核中添加对UBIFS文件系统的支持”
嵌入式2012-04-1913:
55156人阅读评论(0)收藏举报
1.在内核顶层目录下使用命令:
makemenuconfig,进入内核配置菜单,添加对UBIFS文件系统的支持。
(补充:
如果菜单里没有<
>
UBIFSfilesystemsupport的选项,一般2.6.27以上的内核已经支持了UBIFS,所以只需把内核顶层目录下的.config文件里的#CONFIG_MTD_UBI
isnot
set
设置成:
CONFIG_MTD_UBI=y)如图:
之后退出.config文件并保存。
再次进入makemenuconfig菜单这时已经有了<
UBIFSfilesystemsupport的选项,把它设为<
*>
UBIFSfilesystemsupport
*"
是编译进内核的意思
2.在arch/arm/plat-s3c24xx/common-friendly-arm.c中,添加对NANDFlash的MTD分区。
如图:
49-70行为修改部分
(注意:
对应不同开发板路径和分区文件会有所不同,方正就是在arch/arm/mach-s3c2440或者arch/arm/plat下面的某个文件;
我原来就是因为弄错了路径和分区文件所以导致和uboot的默认分区对不上号,所以启动出错,大家可以参考我曾经的出错获得一些启示:
之后,退出保存;
3.回到内核顶层目录之后,
使用命令:
makeuImage
ARCH=arm
CROSS_COMPILE=arm-linux-
,编译内核,在arch/arm/boot/目录下生成内核的镜像uImage,并将生成的uImage拷贝到/tftpboot/目录下等待下载烧写。
[注意:
若没有生成uImage,看编译内核的提示说mkimage命令没有发现(找不到),说明你的系统中没有安装mkimage工具;
解决办法:
在uboot中我们知道mkimage是用来产生u-boot格式映像文件的,所以可以在u-boot源代码(编译之后)中把mkimage拷贝到/bin文件目录下。
具体操作:
我们从u-boot顶层目录下的tools目录中的mkimage拷贝到/usr/bin中,然后重新编译一次内核(即重新执行步骤3的命令)]
遇到的问题及解决方案总结---之三“UBIFS镜像的制作&
烧写”
嵌入式2012-04-1916:
23254人阅读评论(0)收藏举报
二、制作ubifs镜像
步骤1:
将文件系统制作成ubifs镜像文件,需要使用mkfs.ubifs工具,该工具可以在网址:
http:
//git.infradead.org/mtd-utils.git
,下载mtd-utils工具包源码编译后获得。
在安装mtd-utils之前首先在系统中安装如下两个软件:
(因为原先我看一些博文给的地址都不可访问,只好按名称东下一个西下一个,编译后都出错没法解决,特此提醒,后来暮然回首,在我的以前做过的文件系统中找到了以下三个经编译后可成功生成ubifs命令工具,(现放我资源里,提供给大家)请放心下载)
a.安装libacl,(我资源里)下载地址:
输入命令:
rpm
-ivh
libacl-2.2.23-5.4.e14.i386.rpm
b.安装lzo-2.05,(我资源里)下载地址:
执行如下命令:
#
tar
zxvf
lzo-2.05.tar.gz
cd
lzo-2.05
./configure
make
makeinstall
c.安装mtd-utils.tar.gz
(我资源里)下载地址:
zxvfmtd-utils.tar.gz
#cd
mtd-utils
#./configur
#make
#makeinstall
步骤2.使用上述安装命令后,mkfs.ubifs被安装到了/usr/local/usr/sbin目录下,可使用命令:
exportPATH=$PATH:
/usr/local/usr/sbin将该路径包含进环境变量,
然后使用命令:
mkfs.ubifs
-m2048
-c
2048-e
126976
-r
/nfsroot/rootfs
-o
rootfs.bin,将根文件系统所在目录rootfs制作为ubifs镜像文件rootfs.bin,将该文件拷贝到/tftpboot/目录下等待下载烧写。
(注意,你在哪执行这个命令,生成的.bin镜像就在执行此命令的当前目录下生成)
【注意点:
1.上面制作的ubifs镜像文件使用的命令参数是根据开发板所使用的NANDFlash来确定的,我的NANDFlash容量是256MB,可以适应命令:
-h来查看各个命令选项的意思,我这里只简单的介绍一下:
-r:
要制作成镜像的根文件系统的路径
-m:
最小的I/O操作的大小(也就是NANDFLASH的一个page的大小)
-e:
逻辑擦除块的大小
-p:
物理擦除块的大小
-c:
最大逻辑擦除块的数量
-o:
最终制作成的根文件镜像的文件名
注意点:
2.我原来用mkfs.ubifs
rootfs.bin制作成的镜像,启动内核时有错,我曾经的出错现象:
但是发现启动内核时打印此出错信息:
UBIerror:
validate_ec_hdr:
badVIDheaderoffset512,expected2048
badECheader
ubi_io_read_ec_hdr:
validationfailedforPEB556
ubi_init:
cannotattachmtd3
UBIerror:
cannotinitializeUBI,error-22
后来找到了相近的解决方案:
按照这篇帖子最终内核成功的启动了
我现在还不太懂为什么“-e
126976”而不是大多数制作ubifs文件系统写的“-e
129024
”如果大家知道请通知我,不胜感激!
】
步骤3.通过Jlink或者H-JTAG将u-boot.bin先烧进norflash,之后连接好串口线和网线,从norflash启动开发板。
步骤4.设定好网络相关的环境变量,重点是先设置好ipaddr和serverip(因为下面用到tftp协议下载)之后用sav命令保存环境变量;
之后用命令:
tftp
31000000
u-boot.bin
下载uboot.bin到内存地址31000000处。
步骤5:
nanderase060000,将nandflash的前0x60000字节空间擦除掉。
在使用命令:
nandwrite31000000
0
60000,将内存31000000处的u-boot.bin烧写到nandflash中。
步骤6:
31000000uImage
nanderase80000
300000,将nandflash的kernel分区擦除掉,在使用命令:
nandwrite
3100000080000
300000,将内存31000000处的uImage烧写到nandflash中。
步骤7:
mtdpartsdefault
使用默认分区对NandFlash进行分区。
nand
eraseroot,擦除root分区。
ubipart
root
2048
,激活root分区进行ubi格式化。
最后使用命令:
ubi
create
rootfs
创建rootfs分区。
原来我用命令:
ubi
part
来激活root分区进行ubi格式化,但是启动内核时出现报错信息(看红字部分),所以按这篇博文part
之后就没有报错了
badVIDheaderoffset512,expected2048
cannotinitializeUBI,error-22】
步骤8:
tftp31000000
rootfs.bin
下载rootfs到默认内存地址31000000处,使用命令:
write31000000
$filesize,将内存31000000处大小为$filesize的rootfs.bin通过ubi方式烧写到nandflash的对应分区中。
步骤9:
设置启动变量:
bootargs,(bootargs是uboot传给内核的参数,使用命令:
set
bootargs
ubi.mtd=3
root=ubi0:
rootfs
rootfstype=ubifs
console=ttySAC0
init=/linuxrc
rw"
设置启动命令:
bootcmd,(bootcmd是uboot启动的命令,输入命令:
bootcmd
nand
read31000000
80000
$filesize;
bootm
31000000"
最后使用sav命令保存环境变量)
步骤10:
关掉电源,让开发板重新从nand
flash启动,可以看到内核成功加载了我们只做的ubifs文件系统,如图:
[注意点1:
中的"
31000000"
是启动内核的地址,内核启动时自动找到31000000这个地方来启动kernel
;
而前面用过的tftp
xxx
中的"
是内存中的地址(存放在内存地址中的数据掉电后就没了)
注意点2:
如果bootm后面不跟地址,默认是到30008000处寻在内核启动的;
如果bootcmd环境变量写成:
最终这种现象:
如图(因为它到30008000没有找到内核,内核原来由80000的内存地址读到了31000000地址处)
为S3C2440移植内核
2012-04-2422:
2320人阅读评论(0)收藏举报
1.修改晶振频率
S3C2440支持两种频率:
12MHZ和16MHZ.目前市面上出售的开发板大多使用的是12MHZ的晶振,而内核源代码采用的是16MHZ频率,从而产生了错误的PCLK,因此导致内核向串口输出数据时使用了错误的比特率(正确的应该是),这样在超级终端上看到的就是乱码。
因此我们只须修改内核源代码中的晶振频率即可。
将内核顶层目录下的arch/arm/mach-s3c2440/mach-smdk2440.c的第180行:
s3c24xx_init_clocks(16934400);
改为:
s3c24xx_init_clocks(12000000);
2.修改NandFlash分区表
这次内核正常启动,不再出现乱码,但未能成功挂载根文件系统。
出现错误如下:
VFS:
Mountedroot
(jffs2filesystem).
Freeing
init
memroy
:
132k
Warning:
unable
to
openan
initial
console.
Kernelpanic
-
not
syncing
Noinit
found
.
Try
passing
init=
option
kernel.
仔细查看内核出错前的输出,发现内核在Nand
Flash上创建了
8个分区
Creating
8MTD
partitionon
NAND
64MiB3,3v
8-bit"
:
0x00000000--0x00004000:
Boot
Agent"
0x00000000--
0x00200000
S3C2410
flash
partition
1"
0x00400000--
0x00800000
2"
0x00800000--
0x00a00000
3"
0x00a00000--
0x00e00000
4"
0x00e00000--
0x01800000
5"
0x01800000--
0x03000000
6"
0x00300000--
0x04000000
7"
kernelcommalline:
noinitrd
root=/dev/mtdblock2
console=ttySAC0
rootfstype=jffs2
由上面看出,内核会到NANDFlash的0x00400000~0x00800000区间来挂载根文件系统,但事实上通过u-boot烧写根文件系统时,是将其烧写到Nand
Flash的0x00400000~0x04000000这个区间。
所以内核不能成功挂载根文件系统。
因此,必须修改内核对NandFlash的分区定义,让第3个分区位于0x00400000-0x04000000这个区间。
修改arch/arm/plat-s3c24xx/common-smdk.c文件,将static
struct
mtd_partition
....{}函数做如下修改,这样一来,整个Nand
Flash被划分为4个分区。
第一个分区大小1MB,存放u-boot;
第二个分区大小3MB,存放kernel;
第三个分区大小60MB,存放根文件系统;
第四个分区从第64M开始一直到Nand
Flash的最后,可用于扩展。
static
smdk_default_nand_part[]={
[0]={
.name
=
Bootloader"
.size
SZ_1M,
offset
=0,
},
[
1]={
kernel"
.
=SZ_1M,
SZ_2M+SZ_1M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ubifs 文件系统 制作 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)