weixin_40407199
wax5798
2021-06-09 09:09
采纳率: 100%
浏览 26

编译内核模块时,怎么传递 ld 链接脚本参数

最近需要写一个内核模块,其中的函数分成三类: 普通函数 .text 段、特殊的函数 .text.code1 段、特殊的函数 .text.code2 段。当然还有其他一些默认的代码段

现在要求 .text.code2 要在 .text.code1 前面且紧挨着

打算写一个 ld 链接脚本来实现如上功能。但是怎么把这个脚本传递给链接器呢?应该怎么写对应的 Makefile

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • Feng_wwf
    NDSC专家-王文峯 2021-06-09 16:49
    已采纳
    模块安装时候可以给模块中的变量传递数值,安装后,模块中变量的值就是安装时所传入的值 ,没有传递的变量,则使用代码中默认值。
    
    带参数的模块安装后会生成目录:
    /sys/module/模块名/parameters/
    示例:如果安装 了名字为  hello_model_param 的模块,则会生成
    /sys/module/hello_model_param/parameters/
    
    这个文件夹下会生成以参数为名字文件,其内容就是参数的值。可以使用cat 或echo操作这个文件,修改变量的值,但是一般情况下都不建议修改,所以这个权限的值一般设置只读的。
    
    模块中如果变量要通过安装时传参数覆盖默认值,则需要使用以下宏修饰:
    module_param,module_param_array
    
    说明:
    对于非数组类型变量使用module_param,语法:
    module_param(变量名,变量类型,变量的访问权限)  //变量的访问权限:变量会文件系统以一个文件形式呈现,这个文件权限属性就是“变量的访问权限”
    变量传递参数:insmod xx.ko 变量名=值
    
    对于数组类型变量使用 module_param_array , 语法:
    module_param_array(数组名,数组元素类型,&num,变量的访问权限) //num 是一个 char ,int,long 或uchar,uint,ulong类型的变量,用于保存传递给数组的元素个数。
    
    数组传递参数: insmod xx.ko 数组名=元素0,元素1,元素2,  ……
    
    
    基本类型有:
    bool   :布尔类型
    invbool:颠倒了值的bool类型;
    charp  :字符指针类型,内存为用户提供的字符串分配;(char *)
    int    :整型
    long   :长整型
    short  :短整型
    uint   :无符号整型(unsigned int)
    ulong  :无符号长整型(unsigned long)
    ushort :无符号短整型(unsigned short)
    
    指针类只能char*,对应名字 charp .
    
    访问权限:
    modlue_param 和 module_param_array 中的 perm 用于设定该参数的访问权限;
    perm 表示该参数在 sysfs 文件系统中所对应的文件节点的属性;你用该使用<linux/stat.h>中定义的权限值;这
    个值控制谁可以存取这些模块参数在 sysfs 文件系统中的表示;当 perm 为 0 时,表示此参数不存在 sysfs 文件
    系统下对应的文件节点;否则,模块被加载后,会出现 /sys/module/模块名/parameters/参数名 这类文件 ,带
    有给定的权限;
    比如:
    #define S_IRWXU 00700
    #define S_IRUSR 00400
    #define S_IWUSR 00200
    #define S_IXUSR 00100
    #define S_IRWXG 00070
    #define S_IRGRP 00040
    #define S_IWGRP 00020
    #define S_IXGRP 00010
    #define S_IRWXO 00007
    #define S_IROTH 00004
    #define S_IWOTH 00002
    #define S_IXOTH 00001
    注意:如果一个参数被 sysfs 修改了,那么你的模块看到的参数值也被修改了,但是你的模块不会收到任何通知;
    你应当不要使模块参数可写,除非你准备好检测这个改变并因而作出反应;
    

    望采纳,谢谢,看看博主这个文章,希望可以帮助到你

    点赞 评论
  • weixin_40407199
    wax5798 2021-06-10 09:39

    在 Makefile 中使用 ldflags-y 来传递链接参数,如 ldflags-y += -T $(SRC_DIR)/my.lds。其中 SRC_DIR 链接脚本所在路径

    点赞 评论

相关推荐