zoukankan      html  css  js  c++  java
  • [国嵌攻略][105][内核模块可选项]

    模块申明

    1.MODULE_LICENSE(“遵守的协议”)

    申明该模块遵守的许可证协议,如:”GPL”,”GPL v2”等

    2.MODULE_AUTHOR(“作者”)

    申明模块的作者

    3.MODULE_DESCRIPTION(“模块的功能描述”)

    申明模块的功能

    4.MODULE_VERSION(“V1.0”)

    申明模块的版本

    模块参数

    内核模块中通过命令行输入的参数叫做模块参数

    通过宏module_param指定保存参数的变量。模块参数用于在加载模块时传递参数给模块。

    格式:

    module_param(name, type, perm)

    name:变量名称

    type:变量类型,bool:布尔类型,int:整型,charp:字符串类型

    perm:访问权限,S_IRUGO:读权限,S_IWUSR:写权限

    示例:

    int a = 1;

    char *str;

    module_param(a, int, S_IRUGO | S_IWUSR);

    module_param(str, charp, S_IRUGO | S_IWUSR);

    使用:

    insmod hello.ko a=2 str=hello

    符号输出

    内核模块中实现的函数需要被另外一个内核模块调用时,需要用到模块符号输出。

    内核模块符号的输出使用的宏:

    EXPORT_SYMBOL(符号名)

    EXPORT_SYMBOL_GPL(符号名)

    说明:

    其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块。

    Makefile

    obj-m := hello.o add.o
    
    KDIR := /space/work/guoqian/liunxkernel/000/kernel/linux-mini2440
    
    all :
        make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
        
    clean :
        @rm -f *.o *.ko *.mod.* *.order *.symvers

    hello.ko

    #include <linux/init.h>
    #include <linux/module.h>
    
    //全局变量声明
    int num;
    char *str;
    
    //函数原型声明
    extern int add(int a, int b);
    
    //加载函数
    static int hello_init(){
        printk(KERN_WARNING"hello_init!num is %d
    ", num);
        printk("1 + 1 = %d
    ", add(1, 1));
        
        return 0;
    }
    
    //卸载函数
    static void hello_exit(){
        printk(KERN_WARNING"hello_exit!str is %s
    ", str);
    }
    
    //模块信息声明
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("D");
    MODULE_DESCRIPTION("hello");
    MODULE_VERSION("v1.0");
    
    //模块参数声明
    module_param(num, int, S_IRUGO | S_IWUSR);
    module_param(str, charp, S_IRUGO | S_IWUSR);
    
    //模块函数声明
    module_init(hello_init);
    module_exit(hello_exit);

    add.c

    #include <linux/init.h>
    #include <linux/module.h>
    
    int add(int a, int b){
        return a + b;
    }
    
    //加载函数
    static int add_init(){
        return 0;
    }
    
    //卸载函数
    static void add_exit(){
    
    }
    
    //模块信息声明
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("D");
    MODULE_DESCRIPTION("add");
    MODULE_VERSION("v1.0");
    
    //模块符号输出
    EXPORT_SYMBOL(add);
    
    //模块函数声明
    module_init(add_init);
    module_exit(add_exit);
  • 相关阅读:
    typescript-泛型-类型检查
    typescript-class-interface
    typescript-类class
    typescript-接口interface
    Oracle 密码过期
    VMware Redhat虚拟机扩容硬盘
    华硕 U系列电脑拆后盖注意事项
    VS + QT 出现 LNK2001 无法解析的外部符号 QMetaObject 的问题
    c++ _pFirstBlock == pHead
    c++ 套路多
  • 原文地址:https://www.cnblogs.com/d442130165/p/5245148.html
Copyright © 2011-2022 走看看