注意:编译内核时,最好使用make zImage,编译完成之后再把zImage转换成uImage格式,这是肯定可以执行的,但是make uImage生成的uImage文件不一定能执行。
1、修改顶层Makefile
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
2、清除数据
make distclean
3、查看arm架构的板级配置文件
find -name *2410_defconfig
find -name *2440_defconfig
由于2410只有s3c2410_defconfig
2440只有mini2440_defconfig
所以我们使用s3c2410_defconfig配置文件编译
4、make s3c2410_defconfig
5、make uImage
6、cp ./arch/arm/boot/uImage /tftpboot
7、开发板使用tftp下载uImage 启动
tftp 0x30008000 uImage
如果启动过程中出现乱码,需要设置波特率
setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200
由于我们U-BOOT设置的“machid”为362,及0x16a,所以启动内核时使用的是S3C2440开发板,
如果设置波特率还是乱码,那么需要修改mach-smdk2440.c
vi ./arch/arm/mach-s3c24xx/mach-smdk2440.c
把s3c24xx_init_clocks(16934400);
修改为s3c24xx_init_clocks(12000000);
重新编译后再烧写进开发板,应该就不会出现乱码的情况。
二、MTD分区
1、烧写打印信息:
Creating 8 MTD partitions on "NAND":
0x000000000000-0x000000004000 : "Boot Agent"
mtd: partition "Boot Agent" doesn't end on an erase block -- force read-only
0x000000000000-0x000000200000 : "S3C2410 flash partition 1"
0x000000400000-0x000000800000 : "S3C2410 flash partition 2"
0x000000800000-0x000000a00000 : "S3C2410 flash partition 3"
0x000000a00000-0x000000e00000 : "S3C2410 flash partition 4"
0x000000e00000-0x000001800000 : "S3C2410 flash partition 5"
0x000001800000-0x000003000000 : "S3C2410 flash partition 6"
0x000003000000-0x000010000000 : "S3C2410 flash partition 7"
2、从上面的打印信息知道默认分配了8个分区,是在哪分区的呢?搜索关键字"Boot Agent"
3、使用grep命令搜索:grep "\"Boot\ Agent"\" * -nR
4、搜索结果发现:arch/arm/mach-s3c24xx/common-smdk.c:114: .name = "Boot Agent",
5、进入文件:vi arch/arm/mach-s3c24xx/common-smdk.c +114
6、修改后:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "u-boot",
.size = SZ_256K,
.offset = 0,
},
[1] = {
.name = "param",
.offset = MTDPART_OFS_APPEND,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_4M,
},
[3] = {
.name = "rootfs",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
7、MTDPART_OFS_APPEND是紧接着上一个分区的意思,MTDPART_SIZ_FULL是剩下的大小
8、再次编译内核
make zImage
把u-boot的tools目录下的mk2uimage 拷贝到arch/arm/boot/
把编译生成的zImage转变为uImage格式,这是u-boot支持的格式
在arch/arm/boot/目录下执行:./mkz2uimage
最后把uImage拷贝考/tftpboot目录下
9、打印信息,分区的大小跟我分配的一样,说明成功了
Creating 4 MTD partitions on "NAND":
0x000000000000-0x000000040000 : "u-boot"
0x000000040000-0x000000060000 : "param"
0x000000060000-0x000000460000 : "kernel"
0x000000460000-0x000010000000 : "rootfs"
10、到这里,说明内核移植基本成功,后面的工作是制作根文件系统,还有移植驱动,最后都编译进内核
11、移植内核成功后,根据实际情况裁剪内核
所谓裁剪内核,就是把需要的编译进内核,不需要的不用编译
三、制作文件系统
1、下载busybox
http://www.busybox.net/downloads/
2、解压busybox-1.20.0.tar.bz
tar -xvjf busybox-1.20.0.tar.bz2
3、选择交叉编译工具
make menuconfig
Busybox Settings --->
Build Options --->
() Cross Compiler prefix
填写arm-linux-
最后make编译
3. 安装busybox
安装:make install CONFIG_PREFIX=/home/book/nfs/fs_mini_mdev_new
4. 创建lib目录
mkdir /home/book/nfs/fs_mini_mdev_new/lib
mkdir /home/book/nfs/fs_mini_mdev_new/usr/lib -p
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /home/book/nfs/fs_mini_mdev_new/lib -d
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /home/book/nfs/fs_mini_mdev_new/usr/lib -d
5. 构建etc目录
cp -rf /work/nfs_root/fs_mini_mdev_new/etc /home/book/nfs/fs_mini_mdev_new
6. 构建dev目录
mkdir dev
mknod dev/console c 5 1
mknod dev/null c 1 3
7. 其他空目录
mkdir proc tmp mnt sys root
四、建立jffs2文件系统
1、mkfs.jffs2工具下载:
apt-get install mtd-utils
2、mkfs.jffs2使用帮助:
mkfs.jffs2 help
3、建立文件:mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2
下载烧写:
擦除nand:
tftp 0x30008000 fs_mini_mdev_new.jffs2
nand erase 460000 4000000 //460000是root分区的开始地址,4000000擦除nand分区大小
//nand erase.part root
nand write 30008000 460000 $filesize
注意:如果需要使用nand erase.part命令,那么需要注意mtdparts的参数,而不是我们自己给内核分区的名字。
使用printenv查看mtdparts的参数,如:mtdparts=mtdparts=jz2440-0:256k(u-boot),128k(param),4m(kernel),-(RootFs)
设置uboot参数:
/*mtdblock3:即mtd分区,第三块分区,就是root分区*/
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
出现错误:Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
解决: 重新配置内核支持EABI
make menuconfig
------------------------------------------------
Kernel Features --->
Use the ARM EABI to compile the kernel
------------------------------------------------
保存设置,重新编译
五、制作yaffs2文件系统
1、在ubuntu获取源码:git clone git://www.aleph1.co.uk/yaffs2
会在/home/book目录下生成yaffs2文件夹,这就是下载的yaffs2文件
2、进入yaffs2文件夹:
如:cd yaffs-dir
3. 打补丁
./patch-ker.sh c m linux-tree 比如 ./patch-ker.sh c m /home/book/tools/linux-3.4.2
3、打补丁后在./patch-ker.sh c m /home/book/tools/linux-3.4.2/fs/新增YAFFS2文件
4、配置内核,YAFFS2添加进内核
make menuconfig
使用搜索“yaffs”:
Location: x
x -> File systems x
x -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y]) x
x -> yaffs2 file system support (YAFFS_FS [=y]) x
x -> 512 byte / page devices (YAFFS_YAFFS1 [=y]) x
x -> Use older-style on-NAND data format with pageStatus byte (YAFFS_9BYTE_TAGS
重新编译内核:make uImage
======================================================================================================================================
关于在menuconfig搜索“yaffs2”,下面是搜索结果:
----------------------------------------------------------------------------------------------------------------------------------
Symbol: YAFFS_YAFFS2 [=y] x
x Type : boolean x
x Prompt: 2048 byte (or larger) / page devices x
x Location: x
x -> File systems x
x -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y]) x
x (2) -> yaffs2 file system support (YAFFS_FS [=y]) x
x Defined at fs/yaffs2/Kconfig:72 x
x Depends on: MISC_FILESYSTEMS [=y] && YAFFS_FS [=y] x
x Selected by: YAFFS_FS [=y] && MISC_FILESYSTEMS [=y] && MTD_BLOCK [=y]
----------------------------------------------------------------------------------------------------------------------------------
看到这最后一行:x Selected by: YAFFS_FS [=y] && MISC_FILESYSTEMS [=y] && MTD_BLOCK [=y]
提示我们要使用YAFFS_YAFFS2 [=y],就得选上那几项,就是说都是“y”,那说明就可以了。
======================================================================================================================================
5、把fs_mini_mdev_new制作成yaffs2文件
cd /home/book/nfs/
mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2
6、把fs_mini_mdev_new.jffs2烧写进mtd的root分区
首先把fs_mini_mdev_new.jffs2拷贝到tftpboot文件夹下面,并且一定得赋予权限:
chmod 777 fs_mini_mdev_new.jffs2
tftp 0x30008000 fs_mini_mdev_new.yaffs2
nand erase.part RootFs
//nand write 30008000 460000 $filesize
一定得使用下面这个写:
nand write.yaffs 30008000 460000 $filesize
设置uboot参数:
/*mtdblock3:即mtd分区,第三块分区,就是root分区*/
setenv bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=yaffs2
7、烧写错误TFTP error: 'Access violation' (2)
出现这种情况可能制作yaffs2文件出现问题,可以查看yaffs2文件的权限,如果不是666,那么
得设置为666,然后再重新烧写即可。
8、烧写重新编译的uImage
出现错误:Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
解决办法:可能是uboot的问题,使用以前好的uboot启动,结果发现真是uboot的问题,因此,我们需要再次修改我们的uboot。
修改:nand_util.c
把函数:int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,
u_char *buffer, int flags)
if (!need_skip && !(flags & WITH_DROP_FFS))
修改成:if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB))
重新编译U-BOOT, 最后烧写新的u-boot。
tftp扫写u-boot到nandflash的u-boot分区:0x000000000000-0x000000040000 : "u-boot"
tftp 0x30008000 u-boot.bin
nand erase.part u-boot
//nand erase 0 40000 //0是u-boot分区的开始地址,40000擦除nand分区大小
nand write 30008000 0 $filesize