zoukankan      html  css  js  c++  java
  • (实例)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
    

    全文完。

    如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
    若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
    博客地址:https://www.cnblogs.com/schips/
  • 相关阅读:
    【Java线程】Java线程池ExecutorService
    MappedByteBuffer高速缓存文件、RandomAccessFile随机访问
    RandomAccessFile和memory-mapped files
    花1K内存实现高效I/O的RandomAccessFile类
    家庭局域网的组建(2台或2台以上)
    设置IE浏览器代理上网
    局域网Internet的共享
    三层设备---路由器
    二层设备---网桥和交换机
    底层设备---中继器和集线器
  • 原文地址:https://www.cnblogs.com/schips/p/linux-driver-add-exfat-module-in-kernel.html
Copyright © 2011-2022 走看看