kthread_run创建内核线程的原理

本文详细介绍了kthread_run宏的工作原理,它通过kthread_create创建进程,并利用wake_up_process唤醒。kthread_create内部调用kthread_create_on_node,该函数封装了线程信息并加入到链表,由kthreadd内核线程负责从链表中取出信息创建实际的内核线程。kthreadd通过遍历链表并调用create_kthread完成线程创建,最终在kthread函数中执行用户指定的线程函数。
摘要由CSDN通过智能技术生成
    kthread_run是一个宏,用来创建一个进程,并且将其唤醒,其定义在头文件include/linux/kthread.h中.

#define kthread_run(threadfn, data, namefmt, ...)               \
({                                       \
    struct task_struct *__k                           \
        = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
    if (!IS_ERR(__k))                           \
        wake_up_process(__k);                       \
    __k;                                   \
})

    先来看看这个宏的参数,threadfn是该线程的执行函数,data是执行函数的传入参数,namefmt是该线程的printf风格的线程名,最后的...类似printf的可变参数列表.从这个宏的实现可以看出kthread_run是通过kthread_create来创建一个进程,并返回一个task_struct,然后使用wake_up_process函数将新创建的进程唤醒.下面需要关注一下kthread_create的实现,其实它也是一个宏,同样也定义在头文件include/linux/kthread.h中.

#define kthread_create(threadfn, data, namefmt, arg...) \
    kthread_create_on_node(threadfn, data, -1, namefmt, ##arg)

    该宏的参数同kthread_run,不解释了,其实现就是调用了函数kthread_create_on_node,下面来看该函数的实现.

struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),
                       void *data, int node,
                       const char namefmt[],
                       ...)
{
    DECLARE_COMPLETION_ONSTACK(done);
    struct task_struct *task;
    struct kthread_create_info *create = kmalloc(sizeof(*create), GFP_KERNEL);

    if (!create)
        return ERR_PTR(-ENOMEM);
    create->threadfn = threadfn;//线程执行函数
    create->data = data
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值