【问题标题】:what is the best way to trigger a user thread from a kernel module从内核模块触发用户线程的最佳方法是什么
【发布时间】:2015-10-19 21:37:00
【问题描述】:

我在内核中有一个模块,在其中的特定事件/计数上,我想唤醒一个用户线程,该线程将通过 proc fs 从内核模块读取一些数据。

我正在尝试从内核模块向处于睡眠状态的用户线程发送 RT 信号。该信号将调用其处理程序,并进一步从内核读取数据/缓冲区并将其存储到文件中。

我在使用这种方法时遇到了一些未知问题,在发送信号后系统被挂起并且一切都停止了。

请告诉我是否使用正确的方法(使用信号)从内核模块触发用户线程。如果它是正确的,那么锁定问题的可能根本原因是什么。

有什么方法可以用来实现此类功能...请建议/帮助。

内核模块:

static int send_signal(int data)
{
    int ret;
    struct siginfo info;
    struct task_struct *t;

    /* send the signal */
    memset(&info, 0, sizeof(info));
    /* I have tried 44 and 30 but both are not working */
    info.si_signo = sig_num;
    info.si_code = SI_QUEUE;
    info.si_int = data;

    if (!g_user_pid) {
        printk("error seding signal, pid is not configured");
        return -EAGAIN;
    }

    rcu_read_lock();
    t = pid_task(find_pid_ns(g_user_pid, &init_pid_ns), PIDTYPE_PID);
    if (t == NULL) {
        printk("invalid pid\n");
        rcu_read_unlock();
        return -EAGAIN;
    }

    printk("sending value %u to pid %d\n", info.si_int, (int)t->pid);
    ret = send_sig_info(sig_num, &info, t); /* send the signal */
    rcu_read_unlock();

    if (ret < 0) {
        printk("error sending signal\n");
        return ret;
    }
}

PS:我是从中断上下文中调用这个函数的。

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    另一种方法是通过内核模块创建设备文件。在驱动程序放入数据之前,会阻止从此文件中读取。在这种情况下,用户空间应用程序可以在没有任何休眠和捕获信号的情况下打开和读取设备文件数据。

    更新: Here 你可以找到创建只读设备文件的示例。您应该在hello_read_proc() 中添加等待逻辑,这将生成读取块。

    【讨论】:

    • 谢谢!你能解释一下如何实现这样的事情吗?或分享一个链接以了解这一点..
    • @PankajGupta 从头开始​​解释如何做到这一点需要半本书或更多。我建议你买一本关于编写 Linux 设备驱动程序的书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2013-10-17
    • 1970-01-01
    • 2010-10-11
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多