需要记忆的知识
bootloader 在启动内核过程中的作用:
--->内核==>内存 (将内核读入内存)
--->设置TAG参数
--->启动(R0=0 ,R1=机器ID ,R2=TAG参数)
内核启动过程:
根据R1判断是否支持该机器,调用机器相关的初始化函数----》 解析TAG参数 ----》装载外设,硬件的驱动---》挂载文件系统,应用程序
问:为什么要移植新版本的3.4.2内核?
A:因为在挂载fs_mini_mdev_new.jffs2或者fs_mini_mdev_new.yaffs2后发现 ,虽然可以mount,但是程序没有继续跑!
可以看linux内核启动的log:
猜测可能是因为fs_mini_mdev_new.jffs2或者fs_mini_mdev_new.yaffs2是在3.4.2内核下面编译出来的。所以尝试移植新内核3.4.2
问:移植3.4.2的内核的步骤?
1.1 修改Makefile
修改为--->ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
linux-3.4.2$ arm-linux-gcc -v 查看gcc的版本为:gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
1.2 选择默认配置 :
find -name "*defconfig" -->出来一大堆的配置文
./arch/arm/configs/imx_v6_v7_defconfig.......很多
linux-3.4.2/arch/arm/configs$ ls *2410*
make s3c2410_defconfig--->vi .config -->天下s3c2440 的开发版都一样,都来自三星的公板
1.3 make uImage
--->cp arch/arm/boot/uImage /work/nfs_root/uImage_new
-->使用自己成功移植的后的
-->nfs 32000000 192.168.2.5:/work/nfs_root/uImage_bo;bootm 32000000
nfs 32000000 192.168.2.102:/work/nfs_root/uImage_bo;bootm 32000000
-->发现打印都是乱码。断定是uboot下 bootargs 的波特率设置不对
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3启动
另外:如果machid设置部队,同样linux内核启动不起来:MACH的初始化没有完成
1.4 Linux跑起来后,定位内核的源码分区的信息位置,修改内核的分区
根据内核启动后的分区打印的信息:
--->grep "\"Boot\ Agent\uImage"" * -nR
--->Common-smdk.c(arch/arm/mach-s3c24xx)
/* 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,
},
};
问:成功移植3.4.2新内核,如何挂载新的文件系统呢?
1.1挂载文件系统
有时候连接不到服务器,但是ping得通服务器而且以太网也是断开的,就在uboot下输入NFS
nfs 30000000 192.168.2.102:/work/nfs_root/fs_mini_mdev——new.yaffs2
bootm 32000000
发现出现如下仍然挂载不了文件系统 -----》vi .config 发现如下:
# CONFIG_YAFFS_FS is not set
CONFIG_JFFS2_FS=y ----》内核的配置不支持yaffs文件
1.2 那就试着烧写 jffs2文件系统吧
nfs 30000000 192.168.2.102:/work/nfs_root/fs_mini_mdev.jffs2
nand erase.part rootfs (nand erase root)
OpenJTAG> nand write.jffs2 30000000 260000 $(filesize)
OpenJTAG> set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.2.102:/work/nfs_root/uImage_NEW
bootm 32000000 -->看看在老的内核(2.6)下编译出来的文件系统能否支持新的内核!
启动后:VFS: Mounted root (jffs2 filesystem) on device 31:3. 但找不着init文件
启动失败
1.3 在新的内核3.4.2 制作根 jffs2文件系统:
下载busybox-->make menuconfig--->cross complie =arm-linux- 指定交叉编译的环境save
---->make编译--->make install CONFIG PREFIX=/work/nfs_root/fs_mini_mdev_new(CONFIG PREFIX这个是指定了安装的目录)
echo $PATH查看交叉编译的环境 /usr/local/arm/4.3.2/bin
--->分别配置 lib usr etc dev usr tmp 等目录
在制作好的lib usr etc usr dev目录下 制作jffs2的映像文件
烧录fs_mini_mdev_new.jffs2到板子的里面。
烧录启动后提示如下:
VFS: Mounted root (jffs2 filesystem) on device 31:3.
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004
在内核代码里搜索”exitcode“发现 4 代表的意思是SIGILL非法指令。
看下应用程序里面arm-linux-gcc -v里面的 用的是eabi接口(eabi 可执行成应用程序的二进制接口)
所以内核代码也要改为这个接口类型
make uImage ---->重新配置内核支持EABI (用/ 搜索功能 输入 EABI ,找到相应的配置设置为* )
1.4制作完成后,3.4.2烧录jffs2文件系统
busybox制作jffs2或者yaffs文件系统过程看视频,消化!