今天接着移植Linux 3.4.2内核,接着上一篇文章(点击查看:上一篇文章)我们完成了内核的串口启动打印输出,但是无法挂载根文件系统,我们看看启动后显示的是什么:
从打印结构可以看出,我们的分区不对,在U-boot移植(点击查看:Uboot分区)中,我们已经对整个系统进行分区了,现在打印说我们的分区不对,一定是内核里也有分区的相关设置,我们需要去修改内核:
在common-smdk.c中(具体怎么找到这个函数,可以从串口打印找到关键字在内核中搜索看看关键字符串在哪里出现过,这个技巧对于初不熟悉内核架构的人来说很管用),有如下函数,对应的分区的设置:
/* NAND parititon from 2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot Agent",
.size = SZ_16K,
.offset = 0,
},
[1] = {
.name = "S3C2410 flash partition 1",
.offset = 0,
.size = SZ_2M,
},
[2] = {
.name = "S3C2410 flash partition 2",
.offset = SZ_4M,
.size = SZ_4M,
},
[3] = {
.name = "S3C2410 flash partition 3",
.offset = SZ_8M,
.size = SZ_2M,
},
[4] = {
.name = "S3C2410 flash partition 4",
.offset = SZ_1M * 10,
.size = SZ_4M,
},
[5] = {
.name = "S3C2410 flash partition 5",
.offset = SZ_1M * 14,
.size = SZ_1M * 10,
},
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = MTDPART_SIZ_FULL,
}
};
将分区修改为如下这样的:
0x00000000-0x00040000 : “bootloader”
0x00040000-0x00060000 : “params”
0x00060000-0x00260000 : “kernel”
0x00260000-0x10000000 : “root”
即改为:
/* NAND parititon from 2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,//紧接着上一个分区
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL, //剩下的所有分区
}
};
注释:如果我们之前使用的及其ID是set machid 7CF(本身使用的是set machid 16a,查看之前的文章看相关内容:点击查看之前的文章)那么我们需要修改的地方是:mach-mini2440.c文件(与common-smdk.c在同一个目录)中的结构体:
/* NAND Flash on MINI2440 board */
static struct mtd_partition mini2440_default_nand_part[] __initdata = {
[0] = {
.name = "u-boot",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "u-boot-env",
.size = SZ_128K,
.offset = SZ_256K,
},
[2] = {
.name = "kernel",
/* 5 megabytes, for a kernel with no modules * or a uImage with a ramdisk attached */
.size = 0x00500000,
.offset = SZ_256K + SZ_128K,
},
[3] = {
.name = "root",
.offset = SZ_256K + SZ_128K + 0x00500000,
.size = MTDPART_SIZ_FULL,
},
};
改为:
/* NAND Flash on MINI2440 board */
static struct mtd_partition mini2440_default_nand_part[] __initdata = {
[0] = {
.name = "bootloader",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,//紧接着上一个分区
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL, //剩下的所有分区
}
};
我们这里一直使用的是set machid 16a这个机器ID。
好了:
重新编译内核用nfs挂载(具体方法看上一篇文章)内核,启动,显示如下:
由此可知,我们的分区已经正常了,只是还缺少文件系统没有烧写。
我们先烧写一个简单的文件系统看一下能否正常启动系统:
nfs 30000000 192.168.1.101:/work/nfs_root/fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000 889bc0 (这个889bc0大小是文件系统的大小,根据实际情况修改)
烧写文件系统后下载内核启动:
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_new
bootm 32000000
发现还是启动不了,显示不支持yaffs2文件系统,那么再试一下jffs文件系统是否可以:
nfs 30000000 192.168.1.101:/work/nfs_root/fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 5b89a8
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_new
bootm 32000000
显示:
文件系统已经挂载上去了,但是无法启动init进程。
那么看来我们需要制作新的文件系统了!!!我们新的内核不支持我们老的文件系统。
为了区分开,制作文件系统,我们放到下一篇文章(点击链接查看下一篇文章:点击查看)
想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。