欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

移植3.4.2内核

程序员文章站 2022-05-03 09:16:23
...

移植内核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)

    移植3.4.2内核

    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

    —启动新内核,乱码
    移植3.4.2内核

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

    —图1
    移植3.4.2内核
    —图2
    移植3.4.2内核
    —图3
    移植3.4.2内核

  5. 解决上述乱码问题

    5.1 在串口上设置波特率
    移植3.4.2内核
    5.2 在串口上设置单板id
    移植3.4.2内核
    5.3 修改内核相关文件中的晶振频率Mach-smdk2440.c (arch\arm\mach-s3c24xx)
    移植3.4.2内核
    5.4 上传修该文件后,重新编译内核(make uImage),重新烧写,重启新内核
    移植3.4.2内核

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

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

    方法二:在相关文件中查看
    移植3.4.2内核
    移植3.4.2内核

———-2017.11.28

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

  1. 修改分区

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

    1.2 修改文件中关于分区的部分
    移植3.4.2内核

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

  2. 尝试挂载jffs2文件系统

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

    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.4.2内核

  3. 制作根文件系统

    3.1 移植Busybox

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

    移植3.4.2内核

    编译: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.4.2内核

    3.2 安装glibc库

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

    移植3.4.2内核

    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中的各种根文件系统)
    

    移植3.4.2内核

    b. 微改inittab文件
    

    移植3.4.2内核

    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.4.2内核

    3.5 构建其他目录

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

    移植3.4.2内核

  4. 制作jffs2映像文件

    cd /work/nfs_root

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

    移植3.4.2内核

    注释: -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

    移植3.4.2内核

  6. 解决上述出现的错误

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

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

    移植3.4.2内核

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

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

    —配置
    移植3.4.2内核

    移植3.4.2内核

    —重新编译,并重命名

    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
    

    移植3.4.2内核

———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如何给内核打补丁)

    —下载源码
    移植3.4.2内核

    —README-linux
    移植3.4.2内核

    —打补丁

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

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

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

    —进入内核文件夹,make menuconfig
    移植3.4.2内核

    —错误提示
    移植3.4.2内核

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

    —根据错误提示,找到相关文件
    移植3.4.2内核
    —一步步找到结构体定义
    移植3.4.2内核
    移植3.4.2内核
    移植3.4.2内核
    —修改
    移植3.4.2内核
    移植3.4.2内核
    移植3.4.2内核
    —上传文件后,再次编译make uImage后,再次出现错误
    移植3.4.2内核
    —再次修改
    移植3.4.2内核
    移植3.4.2内核
    移植3.4.2内核
    移植3.4.2内核
    —上传文件后,再次编译make uImage后,再次出现错误,再次修改
    移植3.4.2内核
    —上传文件后,再次编译make uImage后,再次出现错误,按照指示修改相关文件
    移植3.4.2内核
    —上传文件后,再次编译make uImage后,再次出现错误,按照指示修改相关文件
    移植3.4.2内核
    —上传文件后,再次编译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.4.2内核

  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

    移植3.4.2内核

———-2017.12.2

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

  1. 裁剪内核

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

    1.2 第一次裁剪

    配置内核:make menuconfig
    

    —去掉一些不需要的单板

    -> System Type                                                                                             
        -> SAMSUNG S3C24XX SoCs Support
    

    移植3.4.2内核
    移植3.4.2内核

    —去掉不需要的文件系统

    -> File systems
    

    移植3.4.2内核

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

    移植3.4.2内核

    1.3 第二次裁剪

    —一些设备驱动
    移植3.4.2内核

    —一些文件系统
    移植3.4.2内核

    移植3.4.2内核

    移植3.4.2内核

    —再次make uImage,但大小为2.15M
    移植3.4.2内核

    1.4 第三次裁剪

    移植3.4.2内核

    移植3.4.2内核

    移植3.4.2内核

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

    移植3.4.2内核

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

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

    解决措施:修改分区

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

    make smdk2440_config

    make

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

    移植3.4.2内核

    —重新编译内核,依旧将其复制到/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下载内核映像到内核分区

    —重启后可查看修改分区是否成功
    移植3.4.2内核
    移植3.4.2内核

    —下载内核到内核分区

    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
    

    移植3.4.2内核

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

移植3.4.2内核

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

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

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

    mv linux-3.4.2 linux-3.4.2_tp
    

    移植3.4.2内核

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

    tar xjf linux-3.4.2.tar.bz2
    

    移植3.4.2内核

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

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

    移植3.4.2内核

  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一样)
    移植3.4.2内核

———-2017.12.7