Linux内核 module_is_live()

函数module_is_live()的功能是判断模块mod是否处于活动状态。

文件包含:

#include <linux/module.h>

函数定义

在内核源码中的位置:linux-3.19.3/include/linux/ module.h

函数定义格式:

static inline int module_is_live(struct module *mod)

输入参数说明

  • mod:模块结构体指针,结构体中包含模块的名称、状态、所属的模块链表等。关于结构体struct module的定义,请参见find_module()函数的分析。

返回参数说明

  • 该函数返回一个整型值,如果为1表示模块处于live(not going)状态;如果为0,则模块mod处于going状态。

实例解析

编写测试文件:module_is_live.c

头文件及全局变量声明如下:

#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static int __init module_is_live_init(void);
static void __exit module_is_live_exit(void);
static int ret;                             //接收返回值

模块初始化函数:

int __init module_is_live_init(void)
{
    ret = module_is_live(THIS_MODULE);  //参数为当前模块
    if( ret == 1 )
        printk("in init, state is:not GOING! \n");
    else
        printk("in init, state is:GOING\n");

    return 0;
}

模块退出函数:

void __exit module_is_live_exit(void)
{
    ret = module_is_live(THIS_MODULE);  //参数为当前模块

    if( ret == 1 )
        printk("in exit, state is:not GOING! \n");
    else
        printk("in exit, state is:GOING\n");

    printk("module exit ok! \n");
}

模块初始化及退出函数调用:

module_init(module_is_live_init);
module_exit(module_is_live_exit);

实例运行结果及分析

首先编译模块,执行命令insmod module_is_live.ko插入模块,然后执行命令dmesg -c,会出现如图A所示的结果。
Linux内核 module_is_live()

执行命令rmmod module_is_live.ko卸载模块,然后执行命令dmesg -c,会出现如图B所示的结果。
Linux内核 module_is_live()

结果分析:

在测试程序中,可以看到在模块初始化函数和模块退出函数中均调用了module_is_live()函数,传入参数均为指向当前模块的指针THIS_MODULE。图A为模块加载时的运行结果,可以看到当前模块的状态为“not GOING”,即处于活动状态。图B为模块卸载时的运行结果,可以看到当前模块的状态为“GOING”,即处于非活动状态,这是因为模块正被卸载的缘故。下面是关于模块状态的说明。

表示模块状态的数据结构为枚举类型module_state,它在内核文件linux-3.19.3/include/linux/module.h中定义,详细信息参考find_module()。module_is_live( )函数判断模块是否处于live状态时,将模块的正在使用和正被加载状态视为活动状态,而将模块的正被卸载状态视为非活动状态。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!