JZ2440移植新的内核Linux3.4.2 + 挂载文件系统(之前的内核为Linux version 2.6.22.6)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27516841/article/details/87775890

需要记忆的知识

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文件系统过程看视频,消化!

猜你喜欢

转载自blog.csdn.net/qq_27516841/article/details/87775890