zoukankan      html  css  js  c++  java
  • Linux 内核 编译模块

    背景:

    由于调试内核或者由于分区大小限制,有时候内核组件不一定完全需要编进内核中。
    所以,在开发中经常将内核组件编译成为模块,等到在恰当的时机加载。

    概览:

    Linux内核模块的编译方法有两种:

    1.放入linux内核源码中编译。
    2.独立编译模块。

    放入Linux内核源码中编译:

    首先需要了解Kconfig和Makefile的作用

    Kconfig:对应内核模块的配置菜单。
    Makefile:对应内核模块的编译选项。

    Linux内核编译过程:根据配置裁剪的结果配合Makefile完成内核编译。

    以ARM平台为例,具体配置过程:
    
    1.当执行make menuconfig 时,系统首先读取arch/arm/Kconfig生成整个配置界面
    
    2.在读取配置界面的同时,系统会读取顶层目录下的.config文件,生成所有配置选项的默认值
    
    3.当修改玩配置并保存后,系统会更新顶层目录下的.config
    
    4.当执行make时,各层的Makefile会根据.config文件中的编译选项来决定哪些文件会被编译到内核中,或者编译成模块。

    添加到内核的步骤这里省去:《简单添加自己的驱动程序到Linux内核树中

    在内核配置页中,将组件配置成M模块以后,可以参考使用以下命令。(下划线部分根据实际情况增减)

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

    之后,便可以在打印信息中找到模块所在路径,拷贝出来即可。

    例如

    LD [M] drivers/media/usb/gspca/gspca_main.ko
    LD [M] fs/exfat/exfat.ko

    独立模块编译:

    1.根据内核模块编写规则,编写好有关的模块。

    2.新建Makefile,参考以下内容(根据实际情况进行修改,注意tab对齐)

    # 最终的模块名
    obj-m += led_drv.o
    
    # 内核源码所在根目录
    KERNELDIR:=/home/schips/linux3.18/
    
    # 指定的编译工具链
    CROSS_COMPILE:=/usr/local/cross/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
    # 以下内容一般不做修改
    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

    3. make 即可。

    这里是Linux移植exfat驱动的实例:《Linux 内核添加exfat驱动

  • 相关阅读:
    Python+paramiko实现绕过跳板机免密登录服务端
    ssh-keygen生成公钥私钥
    连接MySQL报 unblock with 'mysqladmin flush-hosts' 问题解决
    查询MySQL连接数
    Git常用操作命令
    cmd命令、Python脚本生成任意大小任意格式文件
    颜色渐变实现
    4月简单总结
    大佬经历读后感
    Echarts实践-实现3D地球
  • 原文地址:https://www.cnblogs.com/schips/p/12089836.html
Copyright © 2011-2022 走看看