Linux内核 tasklet_kill()

函数:tasklet_kill( )

文件包含:

        #include<linux/interrupt.h>

函数定义:

在内核源码中的位置:linux-3.19.3/kernel/softirq.c

函数定义格式:

void tasklet_kill(struct tasklet_struct *t)

函数功能描述:

此函数用于阻塞当前线程,等待中断处理函数的执行完毕。此函数通过循环检测中断字段state的值,判断中断处理函数的执行情况,当中断处理函数执行完毕之后,循环结束,然后将字段state清零,函数返回。

输入参数说明:

此函数的输入参数是struct tasklet_struct结构体类型的指针变量,代表软中断的描述符信息,其定义及详细解释参考函数__tasklet_hi_schedule( )分析文档的输入参数说明部分。

返回参数说明:

此函数的返回值是void类型的变量,即函数不返回任何值。

实例解析:

编写测试文件:tasklet_kill.c

头文件引用及全局变量声明:

#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static unsigned long data=0;
static struct tasklet_struct tasklet;

中断处理函数定义:

// 自定义软中断处理函数,在此只有显示功能
static void irq_tasklet_action(unsigned long data)
{
    printk("in the irq_tasklet_action the state of the tasklet is :%ld\n", (&tasklet)->state);
    printk("tasklet running. by author\n");
    return;
}

模块初始化函数,验证函数的调用:

static int   __init tasklet_kill_init(void)
{
    printk("into tasklet_kill_init\n");
    tasklet_init(&tasklet, irq_tasklet_action, data);
                          //初始化一个struct tasklet_struct变量,对应一个软中断
    printk("the state of the tasklet after tasklet_init is :%ld\n", (&tasklet)->state);
                                             //显示当前中断状态
    tasklet_schedule(&tasklet);              //将中断变量放入软中断执行队列
    printk("the state of the tasklet after tasklet_schedule is :%ld\n",
(&tasklet)->state);                              //显示中断状态
    tasklet_kill(&tasklet);                  //阻塞本线程,等待中断处理函数的执行完毕
    printk("the state of the tasklet after tasklet_kill is :%ld\n", (&tasklet)->state);
                                             //显示当前中断状态
    printk("out tasklet_kill_init\n");
    return 0;
}

模块退出函数:

static void   __exit tasklet_kill_exit(void)
{
    printk("Goodbye tasklet_kill\n");
    return;
}

模块加载、退出函数的调用:

module_init(tasklet_kill_init);
module_exit(tasklet_kill_exit);

实例运行结果及分析:

编译模块,执行命令insmod tasklet_kill.ko插入内核模块,然后输入命令dmesg -c查看内核输出信息,出现如图所示结果。

Linux内核 tasklet_kill()

结果分析:

由图可以看出中断处理函数在模块加载函数之前执行完毕,并且阻塞在函数tasklet_kill( )的位置,函数tasklet_kill( )执行完毕之后,中断的状态值变为0。如果注释调函数tasklet_kill( ),则不会出现如图所示的结果,中断处理函数不会在模块加载函数之前执行完毕,而是在其后执行。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!