• 2.移植3.4内核-支持烧写yaffs2,裁剪内核并制作补丁


    上章-制作文件系统,并使内核成功启动jffs2文件系统

    本章主要内容如下:

    • 1)使内核支持yaffs2文件系统
    • 2)裁剪内核
    • 3)制作内核补丁

    1.首先获取yaffs2源码(参考git命令使用详解)

    cd /work/nfs_root
    
    git clone git@github.com:lifeyx/yaffs2.git
    //若下载出现error:403,可以试试vi /etc/resolv.conf,将nameserver地址改为: 114.114.114.114

    2.将yaffs2源码来配置到内核里(使内核支持yaffs2)

    vi /work/nfs_root/yaffs2/README-linux

    找到以下几段话:

    参考上图:

    /*给内核打补丁*/
    cd /work/nfs_root/yaffs2/
    ./patch-ker.sh  c m /work/system/linux-3.4.2//c:将yffs2文件夹copy到linux-3.4.2/fs里, m:指定多版本
    
    
    /*通过menuconfig,来使内核支持yaffs2*/
    cd /work/system/linux-3.4.2/
    make menuconfig            

    搜索yaffs,找到位于:

    • -> File systems
    •       -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])
    •              <*>   yaffs2 file system support                      //按Y键,使内核支持yaffs2

    3.然后make uImage

    如下图所示,出现很多错误:

     

    如上图,问题都是出在fs/yaffs2/下,很多error都讲述:调用的成员名,在struct mtd_info结构体里没有定义.

    接下来我们便将fs/yaffs2文件夹添加到内核3.4的si工程中.

    3.1然后进入yaffs2/yaffs_vfs.c,第2514行:

     然而发现struct mtd_info *mtd的结构体mtd_info定义的是_sync成员,如下图所示:

     

    3.2 修改代码

    所以接下来只有遇到与struct mtd_info有关的error,都在成员前加上: _

    比如:

    • yaffs_vfs.c文件2514~2515行的mtd->sync 改为: mtd->_sync
    • yaffs_vfs.c文件2702行的mtd->erase改为: mtd->_erase
    • yaffs_vfs.c文件2703行的mtd->read改为: mtd->_read
    • ... ...
    • 并将yaffs_vfs.c的第2967行的  root = d_alloc_root(inode);改为: root = d_make_root(inode);

    全部修改后,再次make uImage,接下来便制作yaffs2文件系统

    4.制作yaffs2文件系统

    由于上章-我们制作了文件系统,名为fs_mini_mdev_new,所以直接使用mkyaffs2image工具制作:

    mkyaffs2image  fs_mini_mdev_new  fs_mini_mdev_new.yaffs2 

    然后通过uboot来烧写yaffs2、烧写uImage:

    最后启动yaffs2成功:

     

    5.内核裁剪

    为什么要裁剪内核?

    因为mtd的kernel分区只有2M大,而实际内核有2.37MB,所以需要裁剪到小于2M(或者修改mtd分区值)

    5.1首先裁剪内核里无关的CPU/单板文件

    1)通过vi .config,然后搜索2440,如下图所示:

     

     

    2)然后参考上图,make menuconfig

    进入System Type ---> SAMSUNG S3C24XX SoCs Support:

     

     

    如上图所示,CPU下只选择2440,单板文件下只选择SMDK2440以及MINI2440相关

    5.2 裁剪无关的文件系统ext2、ext3、ext4

    重新make menuconfig,进入File systems,去掉:

    < > Second extended fs support               //ext2

    < > Ext3 journalling file system support 

    < > The Extended 4 (ext4) filesystem

    5.3裁剪光盘文件系统CD-ROM

    进入File systems---> CD-ROM/DVD Filesystems,去掉:

    < > ISO 9660 CDROM file system support         

     

    5.4裁剪不常用的杂项文件系统

    进入File systems---> Miscellaneous filesystems,去掉:

    < >   Compressed ROM file system support (cramfs)    // cramfs压缩文件系统

    [ ]     Include support for ZLIB compressed file systems //zlib压缩文件系统

    < >   ROM file system support                            // Romfs

    5.5  通过内核启动信息来裁剪

    如下图所示,内核启动时,看到初始化了PS2鼠标驱动

     

     

    由于,我们2440板子只有USB接口,所以需要裁剪掉PS2鼠标驱动:

    重新make menuconfig,进入Device Drivers-> Input device support,去掉:

    [ ]     Provide legacy /dev/psaux device    //PS2鼠标鼠标指向的鼠标设备文件

    [ ]   Mice  --->                   //其它各种鼠标驱动,包括PS2鼠标、I2C鼠标、触摸板等

    5.6 通过.config文件的内容来裁剪

    1)通过vi .config,找到如下图所示,由于CONFIG_TOUCHSCREEN_USB(USB触摸板)很少见到,所以去掉

     

     

    2) USB-based Watchdog Cards(基于usb的看门狗卡)

    如下图所示,这个看门狗卡很少用到,所以去掉CONFIG_SSB_POSSIBLE

     

     

    3) Sonics Silicon Backplane (Sonics公司下的Silicon底板)

    如下图所示,这个公司的产品没有用到,所以去掉CONFIG_BCMA_POSSIBLE

     

     

    4) 找到如下图所示,由于CONFIG_SND_USB (USB声卡)没用到,所以去掉

     

     

    5)去掉CONFIG_USB_LIBUSUAL,没用到

     

     

    5.7 最后通过5.6小节查找的裁剪内容,来make menuconfig

    1)去掉CONFIG_TOUCHSCREEN_USB

    -> Device Drivers                                                                    

      -> Input device support

        -> Generic input layer

           -> Touchscreens

    <*>   Samsung S3C2410/generic touchscreen input driver   //加上自带的触摸屏驱动

    < >   USB Touchscreen Driver                                              //去掉USB触摸屏驱动 

    2)去掉CONFIG_SSB_POSSIBLE

    搜索如下图所示,该宏是被别的选项设置,所以去掉不了:

     

    3)去掉CONFIG_BCMA_POSSIBLE

    该宏也没找到,所以去掉不了

    4)去掉CONFIG_SND_USB

    -> Device Drivers

    -> Sound card support

      -> Advanced Linux Sound Architecture

    [ ]   USB sound devices              //去掉USB声卡驱动

    5)去掉CONFIG_USB_LIBUSUAL

    -> Device Drivers 

    -> USB support

    [ ]   The shared table of common (or usual) storage devices       

    6.给内核制作补丁

    制作补丁之前,首先需要make distclean清除所有的配置文件,也包括了menuconfig菜单

    而menuconfig菜单是通过读取.config文件来生成的.

    所以我们需要保存.config文件

    步骤如下:

    cp .config  config_ok            //保存到config_ok文件
    make distclean                  
    cd ..
    
    mv linux-3.4.2  linux-3.4.2_new  //更改文件名
    tar -xjf linux-3.4.2.tar.bz2             //解压需要比较的源文件
    
    diff -urN linux-3.4.2 linux-3.4.2_new > linux-3.4.2_new.patch    //生成补丁文件linux-3.4.2_new.patch

    未完待续,下章来移植以前2.6内核的驱动到3.4内核

     

     

     

     

     

     

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/lifexy/p/8360970.html
Copyright © 2020-2023  润新知