内核模块 信息和符号导出

信息导出(推荐):代码弱相关的信息

本质是定义 static 字符数组存放指定字符串。
字符串链接时存放在 .modinfo 字段。
可用 modinfo 命令来查看这些模块信息。
--------------------
模块版本:MODULE_VERSION("<version>");
声明作者:MODULE_AUTHOR("<name>")
功能描述:MODULE_DESCRIPTION("<description>");
模块别名:MODULE_ALIAS("<alias>");
声明支持的设备:MODULE_SUPPORTED_DEVICE("<name>")
--------------------
☆申明设备支持表:用于动态加载(热插拔相关)
MODULE_DEVICE_TABLE(<device>, <id_table>);
    device:设备类型。最终展开成设备结构体 struct XXX_device_id(见 mod_devicetable.h)。
    id_table:自定义设备表。最后一项必须是空(标识结束)

模块符号导出(可选)

将自身的符号导出给其他模块,符号需在头文件中说明。
符号可以是变量或函数,但必须是全局的。
使用符号的模块,需使用 extern 声明,或 #include 头文件。
有依赖关系时,需要先加载依赖实现的模块。

--------------------
EXPORT_NO_SYMBOLS               不向内核符号表导出符号
EXPORT_SYMBOL("<symb>");        指明要导出的符号。所有模块都能使用。
EXPORT_SYMBOL_GPL("<symb>");    符号仅对申明GPL许可的模块可用。

模块传参(可选):本质是将模块的符号导出

insmod 加载驱动时,可将参数传进驱动程序。

  查看参数:cat /sys/module/<mdl_name>/parameters/<param_name>
  加载命令:insmod <mdl>.ko <name1>=abc [<type1>=int <perm1>=0774][...]

模块内使用方法:
申明全局静态同名参数变量并初始化。
用宏module_param/module_param_array指定传入参数的信息。
用宏MODULE_PARM_DESC导出参数说明给 modinfo命令

    |--------------------------------------|
    |static int <name> = 0;                |
    |module_param(<name>, <type>, <perm>); |
    |MODULE_PARM_DESC(<name>, "<desc>");   |
    |--------------------------------------|

宏说明:

   module_param(<name>, <type>, <perm>);
    module_param_array(<name>, <type>, &<num> <perm>);
        name:传入参数名,对应模块中的全局变量。格式如下
            name=value
            name=val1,val2,val3...
        type:参数类型。要和全局变量类型一致
            bool/inbool:inbool 布尔取反(0/1)
            charp:字符指针,最大为 1kb("")
            short/ushort/int/uint/long/ulong
        num:列表参数个数的地址。列表使用逗号 , 分隔。
            预防越界,实际空间由模块数组确定。
        perm:参数访问权限
            权限定义于 include/linux/stat.h
            也可以使用 0775、0644 等数值
    MODULE_PARM_DESC(<name>, "<desc>");
        name:module_param 的参数名
        desc:对参数名的描述

其他传参方式示例:

手动修改参数:echo "<value>" > /sys/module/<mdl_name>/parameters/<param_name>
uboot 给模块传参:setenv bootargs ' XXX <module_name>.<module_value>=<value>';
Linux内核模块编译、加载、运行机制分析、版本控制、许可声明、内核污染、模块传参、模块签名机制、out-of-tree动态模块编译及Makefile模板编写,尽在《Linux内核编程》,详情点击:王利涛老师个人淘宝店:Linux内核编程