移植3.4.2内核

移植内核linux-3.4.2

移植3.4.2内核—框架介绍及简单修改

  1. 获取linux内核源码

    获取linux内核源码网站

  2. 内核

    启用应用程序(最终目标) <– 挂载根文件系统 <– 装载驱动程序(网卡、Flash) <– 解析TAG参数 <– 根据r1(机器ID),判断能否支持该机器,调用机器相关初始化函数

  3. 解压内核源码,并首次配置编译内核,并将新内核放到之前创建的根文件系统目录中

    tar xjf linux-3.4.2.tar.gz

    cd linux-3.4.2

    vi Makefile (修改Makefile)

    make s3c2410_defconfig

    make uImage

    cp arch/arm/boot/uImage /work/nfs_root/uImage_3.4.2

  4. nfs下载新内核到sdram,启动新内核,出现乱码(如图)

    nfs 32000000 192.168.0.3:/work/nfs_root/uImage_3.4.2

    bootm 32000000

    —启动新内核,乱码

    注:这里出现一个小插曲---nfs下载时出现错误(图1);
        解决措施:在ubutun上修改/etc/hosts文件(sudo vi /etc/hosts)(图2);
        修改文件后,可以成功nfs下载(图3);
    

    —图1

    —图2

    —图3

  5. 解决上述乱码问题

    5.1 在串口上设置波特率

    5.2 在串口上设置单板id

    5.3 修改内核相关文件中的晶振频率Mach-smdk2440.c (arch\arm\mach-s3c24xx)

    5.4 上传修该文件后,重新编译内核(make uImage),重新烧写,重启新内核

    注:这里插讲一下5.2中的获取单板id
    

    方法一:重启开发板,任意设置一个单板id(如:set machid 33456)后,nfs下载新内核,重启内核(bootm),串口会出现该uImage支持的单板和对应的id

    方法二:在相关文件中查看

———-2017.11.28

移植3.4.2内核—修改分区及制作根文件系统

  1. 修改分区

    1.1 接着上节5.4,根据如图提示,在内核源码中搜索”Boot Agent”,找到相关文件

    1.2 修改文件中关于分区的部分

    1.3 上传文件,重新编译内核(make uImage)并拷贝映像文件(cp …..),nfs下载新内核,重新启动,显示分区成功

  2. 尝试挂载jffs2文件系统

    2.0 由于新内核启动后,提示未挂载成功文件系统(图1)。在.config文件中可以得知该映像支持JFFS2,还不支持YAFFS(在该文件中搜索)

    2.1 尝试挂载jffs2文件系统(旧的jffs2文件系统)

    —设置环境参数支持jffs2

    set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

    —烧写fs_mini_mdev.jffs2(/work/nfs_root文件夹下)

    nfs 30000000 192.168.0.3:/work/nfs_root/fs_mini_mdev.jffs2

    nand erase.part rootfs

    nand write.jffs2 30000000 260000 5b89a8

    —烧写新内核

    nfs 32000000 192.168.0.3:/work/nfs_root/uImage_3.4.2

    bootm 32000000

    —结果(没有成功)

  3. 制作根文件系统

    3.1 移植Busybox

    解压:tar xjf busybox-1.20.0.tar.bz2
    
    进入文件夹:cd busybox-1.20.0
    
    配置:make menuconfig
            Busybox Settings  --->
                Build Options  --->
    

    编译:make
    
    在/work/nfs_root下创建安装目录:mkdir fs_mini_mdev_new
    
    在busybox-1.20.0文件夹下执行安装命令:make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new
    
    进入安装位置,查看(如图)       
    

    3.2 安装glibc库

    a. 找到库的存放位置(echo $PATH)
    

    b. 拷贝库(-d:链接文件拷过去依旧是链接文件)
        在fs_mini_mdev_new文件夹下,创建lib、usr/lib两个目录:
            mkdir lib
            mkdir usr/lib -p
        cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib -d
        cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* usr/lib -d
    

    3.3 构建/etc目录

    a. 拷贝/work/nfs_root/tmp/fs_mini_mdev文件夹下的etc到/work/nfs_root/fs_mini_mdev_new下
    (内核启动第一个进程后,打开inittab,根据inittab中的指令执行init.d中的rcS脚本,又根据该脚本中的mount -a命令挂接fatab中的各种根文件系统)
    

    b. 微改inittab文件
    

    3.4 构建/dev目录

    a. 在/work/nfs_root/fs_mini_mdev_new下创建目录:mkdir dev
    
    b. 创建console节点:sudo mknod console c 5 1
       创建null节点:   sudo mknod null c 1 3
    
    c. 查看
    

    3.5 构建其他目录

    在/work/nfs_root/fs_mini_mdev_new下创建其他目录:
    
    mkdir proc mnt tmp sys root
    
    查看最终根文件系统目录:
    

  4. 制作jffs2映像文件

    cd /work/nfs_root

    mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2

    注释: -n:
          -s 2048:
          -e 128KiB:
          -d:
          -o:
    
  5. 重新烧写刚刚制作的jffs2文件系统,并烧写新内核,启动后出现错误(如图)

    nfs 30000000 192.168.0.3:/work/nfs_root/fs_mini_mdev_new.jffs2

    nand erase.part rootfs

    nand write.jffs2 30000000 260000 3b8e30

    set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

    nfs 32000000 192.168.0.3:/work/nfs_root/uImage_3.4.2

    bootm 32000000

  6. 解决上述出现的错误

    6.1 在内核源码中搜索指示的错误关键字”exitcode”,一路找到相关宏定义

        do_exit
            exit_notify
                forget_original_parent  
                    find_new_reaper(包含exitcode的函数,向上一直搜索调用,找到do_exit函数)
    

    —再在源码中搜索do_exit,找到Seccomp.c文件,找到相关的宏定义(SIGILL = illegal instruction)

    6.2 解决方法:配置内核,使其支持EABI

    —配置

    —重新编译,并重命名

    make uImage
    
    cp arch/arm/boot/uImage /work/nfs_root/uImage_eabi_3.4.2 
    

    6.3 重启开发板后,设置环境参数,下载新内核uImage_eabi_3.4.2,启动内核后,串口显示如图,则成功挂载文件系统(如图)

    set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
    
    nfs 32000000 192.168.0.3:/work/nfs_root/uImage_eabi_3.4.2
    
    bootm 32000000
    

———2017.11.30

移植3.4.2内核—支持yaffs文件系统

(注)若ubutun可以安装git(现用的9.10版不行),则可以在https://yaffs.net/get-yaffs根据git命令下载(git clone git://www.aleph1.co.uk/yaffs2)

  1. 给3.4.2内核打yaffs2补丁,并配置内核使其支持yaffs文件系统

    1.1 在网上下载的yaffs2源码(yaffs2-34292b4),进入yaffs2文件夹,打补丁(查看README-linux-patch如何给内核打补丁)

    —下载源码

    —README-linux

    —打补丁

    cd yaffs2-34292b4
    ./patch-ker.sh c m /work/system/linux-3.4.2
    

    —查看内核源码中是否已包含yaffs2目录

    1.2 配置内核,使之支持yaffs文件系统,重新编译,出现一大堆错误

    —进入内核文件夹,make menuconfig

    —错误提示

    1.3 逐步解决上述错误(将yaffs目录添加到si工程中,便于修改代码)

    —根据错误提示,找到相关文件

    —一步步找到结构体定义



    —修改



    —上传文件后,再次编译make uImage后,再次出现错误

    —再次修改




    —上传文件后,再次编译make uImage后,再次出现错误,再次修改

    —上传文件后,再次编译make uImage后,再次出现错误,按照指示修改相关文件

    —上传文件后,再次编译make uImage后,再次出现错误,按照指示修改相关文件

    —上传文件后,再次编译make uImage,编译成功,并命名为uImage_4.3.2_yaffs2

    cp arch/arm/boot/uImage /work/nfs_root/uImage_4.3.2_yaffs2
    
  2. 制作yaffs2映像

    —进入/work/nfs_root文件夹,将上节课的根文件系统fs_mini_mdev_new
    制作成yaffs2映像

    mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2
    

  3. 烧写刚制作的yaffs2映像(fs_mini_mdev_new.yaffs2),使用默认环境参数(默认文件类型为yaffs),nfs烧写新内核(uImage_4.3.2_yaffs2),启动内核,成功挂载yaffs文件系统

    nfs 30000000 192.168.0.3:/work/nfs_root/fs_mini_mdev_new.yaffs2

    nand erase.part rootfs

    nand write.yaffs 30000000 260000 791340

    nfs 32000000 192.168.0.3:/work/nfs_root/uImage_4.3.2_yaffs2

———-2017.12.2

移植3.4.2内核—裁剪及ECC简介及制作补丁

  1. 裁剪内核

    1.1 查看截至上节编译的内核映像uImage的大小

    1.2 第一次裁剪

    配置内核:make menuconfig
    

    —去掉一些不需要的单板

    -> System Type                                                                                             
        -> SAMSUNG S3C24XX SoCs Support
    


    —去掉不需要的文件系统

    -> File systems
    

    —再次make uImage,但大小为2.19M

    1.3 第二次裁剪

    —一些设备驱动

    —一些文件系统

    —再次make uImage,但大小为2.15M

    1.4 第三次裁剪

    —再次make uImage,将其复制到/work/nfs_root文件夹下,命名为uImage_small(但大小还为2.15M,依旧不能小于2M)

    cp arch/arm/boot/uImage /work/nfs_root/uImage_small

  2. 解决内核大小超过2M,但依然想将其烧到Nand分区中的问题

    解决措施:修改分区

    2.1 修改uboot源码中的配置文件smdk2440.h,重新配置编译uboot

    make smdk2440_config

    make

    2.2 修该内核源码中关于分区的文件:common_smdk.c

    —重新编译内核,依旧将其复制到/work/nfs_root文件夹下,命名为uImage_small

    make uImage

    cp arch/arm/boot/uImage /work/nfs_root/uImage_3.4.2_small

  3. 重新烧写整个系统(u-boot.bin、uImage_small、fs_mini_mdev_new.yaffs2)

    3.1 tftp烧写(更新)uboot

    tftp 30000000 u-boot.bin
    nand erase.part u-boot
    nand write 30000000 u-boot
    

    3.2 断电并设为nand启动,重新上电后,nfs下载内核映像到内核分区

    —重启后可查看修改分区是否成功

    —下载内核到内核分区

    nfs 30000000 192.168.0.3:/work/nfs_root/uImage_3.4.2_small
    nand erase.part kernel
    nand write 30000000 kernel
    

    3.3 nfs下载yaffs2映像到文件系统分区

    nfs 30000000 192.168.0.3:/work/nfs_root/fs_mini_mdev_new.yaffs2
    nand erase.part rootfs
    nand write.yaffs 30000000 460000 $filesize 
    

    3.4 设置机器ID(smdk2440单板id为16a)

    set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
    set machid 16a
    save
    

    3.5 重启开发板,成功启动内核,并挂载yaffs文件系统

    reset
    

补充:内核启动后,在打印信息中,也可找到之前的修改后的内核分区大小为4M

  1. 制作内核补丁文件(注意目录的变换)

    4.1 将内核中.config文件拷贝为config_ok后,make distclean

    4.2 将linux-3.4.2文件夹重命名为linux-3.4.2_tp

    mv linux-3.4.2 linux-3.4.2_tp
    

    4.3 解压从网上下载的内核源码

    tar xjf linux-3.4.2.tar.bz2
    

    4.4 用diff命令制作内核补丁文件

    diff -urN linux-3.4.2 linux-3.4.2_tp > linux-3.4.2_tp.patch
    

  2. 给内核源码打补丁,并编译内核

    进入源码解压后的文件夹(/work/system/linux-3.4.2),使用patch命令

    patch -p1 < ../linux-3.4.2_tp.patch

    cp config_ok .config

    make uImage(生成跟之前linux-3.4.2_tp中的uImage一样)

———-2017.12.7

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值