• (实例)Linux 内核添加exfat驱动


    背景:

    由于exfat是常用的文件系统格式,而Linux由于版权的问题,没有在官方中添加有关的驱动。

    但是 微软也同意开源了,所以比较新的 Linux 会支持这一块。

    为了支持exfat的驱动,我们需要手动添加第三方的驱动支持。

    这里演示2种添加exfat格式的驱动,而不将驱动编译进内核。

    有关文章:《Linux 内核 编译模块》,《简单添加自己的驱动程序到Linux内核树中

    驱动来源:https://github.com/arter97/exfat-linux

    准备:

    下载exfat驱动:

    git clone https://github.com/arter97/exfat-linux.git
    

    略:准备Linux内核源码,配置内核编译用的gcc

    注:由于实际编译的时候,提示了函数重定义这个错误。所以需要注释掉冲突的代码

    img

    备份:为了方便演示,复制两份linux内核源码。

    linux3.18_module_in : 驱动放进内核源码中进行编译

    linux3.18_module_out : 驱动作为独立编译的组件。

    放入linux内核源码中编译:

    实际上,这一步只要在最后将驱动配置成 y 就可以编译到内核中。

    根据:README.md中 “Merging the drivers to existing Linux kernel source” 这一章的内容

    1)拷贝驱动源码到内核对应的位置中

    cp exfat-linux ~/linux3.18_module_in/fs/exfat
    

    2)修改exfat同级目录中的Kconfig,与Makefile

    Kconfig:在 "source/fs/fat/Kconfig"之后添加此行

    source "fs/exfat/Kconfig"
    

    img

    Makefile:在 "obj-$(CONFIG_FAT_FS) += fat/"之后添加此行

    obj-$(CONFIG_EXFAT_FS)      += exfat/
    

    img

    3)配置并编译内核

    配置:

    make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- menuconfig
    

    根据实际情况,按Y(配置进内核)或者M(配置成模块),笔者这里编译成模块

    img

    编译:(根据内核配置的选项)

    make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- modules
    #make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- uImage 编译内核
    

    img

    略:拷贝驱动到开发板中

    4)加载烧录,测试。

    img

    一切正常。

    独立编译:

    根据《Linux 内核 编译模块》中参考的Makefile,参考驱动源码中的Makefile做修改

    由于exfat驱动的编译不单单是一个文件,所以需要添加依赖关系。

    obj-m  += exfat.o
    
    # exfat makefile 中原有的依赖关系
    exfat-objs      := super.o core.o core_exfat.o blkdev.o fatent.o cache.o 
                               nls.o misc.o extent.o xattr.o
    
    KERNELDIR:=/home/schips/linux3.18_module_out
    
    
    CROSS_COMPILE:=/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/arm-hisiv500-linux-uclibcgnueabi-
    
    
    PWD:=$(shell pwd)
    
    default:
                    $(MAKE) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules
    
    clean:
                    rm -rf *.o *.order .*.cmd *.ko *.mod.c *.symvers *.tmp_versions
    

    编译:make

    同样地,生成了一份exfat.ko,正常使用即可。

    注:笔者发现根据不同方式生成的ko文件大小和内容上都有小的差异。

    diff exfat.ko*
    Binary file exfat.ko_in and file exfat.ko_out differ
    
    ls -al exfat.ko*
    114K Dec 24 11:41 exfat.ko_in
    115K Dec 24 11:41 exfat.ko_out
    

    全文完。

  • 相关阅读:
    视频:JDBCRDD源码及自定义JDBCRDD的分区策略
    聊聊spark-submit的几个有用选项
    线性求第k大
    汇编基础 第一章_总线
    长度不超过n的连续最大和___优先队列
    ISAP
    次小生成树
    k短路
    求出欧拉回路,欧拉路径
    拓扑排序bfs_dfs
  • 原文地址:https://www.cnblogs.com/schips/p/12305534.html
Copyright © 2020-2023  润新知