zoukankan      html  css  js  c++  java
  • Linux内核模块简单示例

    1. Linux 内核的整体结构非常庞大,其包含的组件也非常多,使用这些组件的方法有两种:

    ① 直接编译进内核文件,即zImage或者bzImage(问题:占用内存过多)

    ② 动态添加

      * 模块本身并不被编译进内核文件

      * 根据需求,在内核运行期间动态安装或卸载

    2. 内核模块动态安装与卸载

    ①安装 insmod

    例:insmod /home/dnw_usb.ko

    ②卸载 rmmod

    例:rmmod dnw_usb

    ③查看 lsmod

    例: lsmod

    3. 模块声明

    ① MODULE_LICENSE()

    ② MODULE_AUTHOR()

    ③ MODULE_DESCRIPTION()

    ④ MODULE_VERSION()

    4. 模块参数

    ① 模块参数用于在加载模块时传递参数给模块

    ② 通过宏module_param指定保存模块参数的变量

      module_param(name, type, perm)

      * name:变量的名称

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

      * perm是访问权限。S_IRUGO:读权限,S_IWUSR:写权限

    ③ 简单示例

    int a = 3;
    char* ptr = NULL;
    module_param(a,
    int, SIRUGO);
    module_param(ptr, charp, SIRUGO);

    命令行:insmod xxx.ko a=10 ptr="HelloWorld"

    5. 符号导出

    ① 如果内核模块中的函数或者全局变量想让其他模块使用,必须进行导出

    ② 内核符号导出使用宏

      EXPORT_SYMBOL(符号名)

      EXPORT_SYMBOL_GPL(符号名)

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

    6. 内核模块简单示例

    ① 模块代码:

    #include <linux/init.h>
    #include <linux/module.h>
    
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("Kevin Wu");
    MODULE_DESCRIPTION("For study Linux module");
    MODULE_VERSION("1.0");
    
    int a = 3;
    char* ptr = NULL;
    
    module_param(a, int, S_IRUGO);
    module_param(ptr, charp, S_IRUGO);
    
    static int hello_init()
    {
        printk(KERN_WARNING"Hello world initlizing
    ");
        printk(KERN_WARNING"a = %d
    ",  a);
        printk(KERN_WARNING"ptr = %s
    ",  ptr);
    
        return 0;    
    }
    
    static void hello_exit()
    {
        printk(KERN_WARNING"Hello world exiting
    ");    
    }
    
    module_init(hello_init);
    module_exit(hello_exit);

    ② Makefile:

    obj-m := helloworld.o
    
    KDIR := /home/Linux/Kernal/linux-2.6.29
    
    all:
        make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
        
    clean:
        rm -f *.o *.ko *.order *.symvers
        
  • 相关阅读:
    深入理解计算机系统第二版习题解答CSAPP 2.2
    深入理解计算机系统第二版习题解答CSAPP 2.1
    oracle 关闭回收站
    在Razor标记内写入文本
    MVC5+EF6 入门完整教程8_1:实体数据模型
    MVC5+EF6 入门完整教程9:多表数据加载
    MVC5+EF6 入门完整教程8:EF6 Code First 数据迁移
    SQL Linq Lambda
    web及H5 的链接测试
    web安全测试之一
  • 原文地址:https://www.cnblogs.com/wulei0630/p/9492577.html
Copyright © 2011-2022 走看看