驱动模块基础(一)

  • 目录
  • 驱动模块基础(一)
    • 1. 一、驱动模块组成
    • 2. 1、头文件(必选)
    • 3. 2、模块参数(可选)
    • 4. 3、模块功能函数(可选)
    • 5. 4、模块加载、释放函数(必选)
    • 6. 5、模块许可声明(必选)
    • 7. 6、其他
    • 8. 二、Hello World模块
    • 9. 三、模块操作工具

驱动模块基础(一)

1. 一、驱动模块组成

2. 1、头文件(必选)

    #include//包含加载模块时需要使用的大量符号和函数定义
    #include//包含模块加载和模块释放函数的宏定义

3. 2、模块参数(可选)

    module_param()

模块传参例子

4. 3、模块功能函数(可选)

5. 4、模块加载、释放函数(必选)

    *模块加载函数   module_init()
    *模块卸载函数   module_exit()

6. 5、模块许可声明(必选)

    MODULE_LICENSE("GPL");                      /*任意版本的GNU公共许可权*/
    MODULE_LICENSE("GPL v2");                   /*GPL版本2许可权*/
    MODULE_LICENSE("GPL and additional rights");/*GPL及其附加许可权*/
    MODULE_LICENSE("Dual BSD/GPL");             /*BSD/GPL双重许可权*/
    MODULE_LICENSE("Dual MPL/GPL");             /*MPL/GPL双重许可权*/
    MODULE_LICENSE("Proprietary");              /*专有许可权*/

7. 6、其他

8. 二、Hello World模块

    #include   //所有内核模块都必须包含这个头文件
    #include          //一些初始化的函数如module_init()

    static int hello_init(void)
    {
        printk("hello_init");
    }
    static void hello_exit(void)
    {
        printk("hello_exit \n");
    }

    MODULE_LICENSE("GPL");  //模块许可声明
    module_init(hello_init); 加载时候调用该函数insmod
    module_exit(hello_exit);卸载时候 rmmod
ifneq  ($(KERNELRELEASE),)
    obj-m:=hello.o
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build #内核源码目录
    PWD:=$(shell pwd)                            #当前目录
all:
    make -C $(KERNELDIR) M=$(PWD) modules
clean:
    rm -rf *.ko *.o *.symvers *.cmd *.cmd.o *.~ core .depend *.mod.c
endif

9. 三、模块操作工具

Linux为用户提供了modutils工具,用来操作模块

insmod   加载模块,indmod hello.ko会自动调用hello_init()函数
rmmod    模块释放,rmmod hello.ko就可以卸载hello.ko模块
modprobe 比较高级的加载和卸载模块命令,可以解决模块之间的依赖问题
lsmod    列出已加载的模块信息
modinfo  查询模块的相关信息,比如作者、版权等。

你可能感兴趣的:(驱动模块基础(一))