驱动模块基础(一)

驱动模块基础(一)

一、驱动模块组成

1、头文件(必选)

    #include<linux/module.h>//包含加载模块时需要使用的大量符号和函数定义
    #include<linux/init.h>//包含模块加载和模块释放函数的宏定义

2、模块参数(可选)

    module_param() 

模块传参例子

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

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

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

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");              /*专有许可权*/

6、其他

二、Hello World模块

    #include <linux/module.h>  //所有内核模块都必须包含这个头文件
    #include <linux/init.h>         //一些初始化的函数如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

三、模块操作工具

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

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

猜你喜欢

转载自blog.csdn.net/sinat_36544290/article/details/80754176