【问题标题】:Running two kernel threads. How to achieve it?运行两个内核线程。如何实现?
【发布时间】:2014-03-20 14:28:15
【问题描述】:

我写了一个内核模块来运行两个线程。但它一直在崩溃。我认为init函数似乎有问题。这是初始化函数

 int __init ksocket_init(void)
 {
    kthread = kmalloc(sizeof(struct kthread_t), GFP_KERNEL);
    memset(kthread, 0, sizeof(struct kthread_t));

    /* start kernel thread */
    kthread->thread = kthread_run((void *)ksocket_start, NULL, MODULE_NAME);
    kthread_server->thread = kthread_run((void *)ksocket_start_server, NULL, MODULE_NAME);

    if (IS_ERR(kthread->thread) || IS_ERR(kthread_server->thread)) {
            printk(KERN_INFO MODULE_NAME": unable to start kernel thread\n");

            kfree(kthread);
            kthread = NULL;

            kfree(kthread_server);
            kthread = NULL;

            return -ENOMEM;
    }

    return 0;
}

这有什么问题吗?我熟悉应用程序级别的多线程。但是,我对内核线程没有足够的了解。任何帮助表示赞赏。

回答:

我正在使用未分配的 kthread_server 变量。

新问题:

但是,现在我无法卸载该模块。这是退出函数。

void __exit ksocket_exit(void)
{
int err;
struct mutex mutex_ks;

mutex_init(&mutex_ks);
if (kthread->thread==NULL)
        printk(KERN_INFO MODULE_NAME": no kernel thread to kill\n");
else
{
        mutex_lock(&mutex_ks);
        err = kthread_stop(kthread->thread);
        mutex_unlock(&mutex_ks);

        /* wait for kernel thread to die */
        if (err < 0)
                printk(KERN_INFO MODULE_NAME": unknown error %d while trying to terminate kernel thread\n",-err);
        else
        {
                while (kthread->running == 1)
                        msleep_interruptible(10);
                printk(KERN_INFO MODULE_NAME": succesfully killed kernel thread!\n");
        }
}

/* free allocated resources before exit */
if (kthread->sock_local != NULL)
{
        sock_release(kthread->sock_local);
        kthread->sock_local = NULL;
}

kfree(kthread);
kthread = NULL;

if (kthread_server->thread==NULL)
        printk(KERN_INFO MODULE_NAME": no kernel thread to kill\n");
else
{
            mutex_lock(&mutex_ks);
        err = kthread_stop(kthread_server->thread);
        mutex_unlock(&mutex_ks);

        /* wait for kernel thread to die */
        if (err < 0)
                printk(KERN_INFO MODULE_NAME": unknown error %d while trying to terminate kernel thread\n",-err);
        else
        {
                while (kthread_server->running == 1)
                        msleep_interruptible(10);
                printk(KERN_INFO MODULE_NAME": succesfully killed kernel thread!\n");
        }
}

/* free allocated resources before exit */
if (kthread_server->sock != NULL)
{
        sock_release(kthread_server->sock);
        kthread_server->sock = NULL;
}

kfree(kthread_server);
kthread_server = NULL;

printk(KERN_INFO MODULE_NAME": module unloaded\n");
}

谁能解决这个问题?

【问题讨论】:

  • 你真的不需要kmalloc 只是为了保留两个指针。为什么不,只保留一个正常的变量?此外,您的 ksocket_startksocket_start_server 函数必须是正确的类型,在这种情况下,您不需要转换为 void *

标签: c multithreading linux-kernel kernel-module


【解决方案1】:

您正在使用kthread_server 下的未分配内存。像kthread 变量一样分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2013-02-27
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多