首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux内核中使用workqueue或kthread执行ELF

在Linux内核中使用workqueue或kthread执行ELF
EN

Stack Overflow用户
提问于 2019-05-02 11:09:20
回答 1查看 133关注 0票数 0

在收到网络消息时,我尝试在内核中启动一个用户空间进程(执行ELF二进制文件)。在网络事件处理程序中,我启动了一个工作队列。在工作队列处理函数中,我调用了do_execve,但出现了内核死机,并显示:

代码语言:javascript
复制
[  113.305996] Unable to handle kernel paging request at virtual address ffffffffffffffd8
[  113.306375] pgd = ffff8000f9d06000
[  113.306520] [ffffffffffffffd8] *pgd=0000000000000000
[  113.306915] Internal error: Oops: 96000004 [#1] SMP

代码:

代码语言:javascript
复制
static void clone_thread(struct work_struct *_work)
{
        struct pcn_kmsg_work *work = (struct pcn_kmsg_work *)_work;
        network_request_t *req = work->msg;
        int ret = 0;

        PSPRINTK("%s: exe_path %s\n", __func__, req->exe_path);
        ret = do_execve(getname_kernel(req->exe_path), NULL, NULL);
        PSPRINTK("%s: filename %p\n", __func__, getname_kernel(req->exe_path));
        PSPRINTK("%s: ret %d\n", __func__, ret);
}

static int handle_network_request(struct pcn_kmsg_message *msg)
{
        network_request_t *req = (network_request_t *)msg;
        struct pcn_kmsg_work *work = kmalloc(sizeof(*work), GFP_ATOMIC);
        BUG_ON(!work);

        work->msg = req;
        INIT_WORK((struct work_struct *)work, clone_thread);
        queue_work(pcn_wq, (struct work_struct *)work);

        return 0;
}
... ...

然后,我尝试在内核线程中调用do_execve。但是由于某些原因,内核线程只执行printk,而不执行do_execve

所以我想知道如何在Linux内核中执行ELF?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-02 15:12:40

您应该使用call_usermodehelper()内部内核API来实现这一点:

代码语言:javascript
复制
#include <linux/kmod.h>

/* ... */ 

{
    char ∗argv[] = { req->exe_path, NULL };
    static char ∗envp[] = {
        "HOME=/",
        "TERM=linux",
        "PATH=/sbin:/bin:/usr/sbin:/usr/bin", NULL };

    return call_usermodehelper( argv[0], argv, envp, UMH_WAIT_EXEC );
}

在我看来,您的struct pcn_kmsg_message很可能在工作队列运行之前就被释放了--您可能需要将exe_path字符串复制到pcn_kmsg_work结构中,而不仅仅是复制指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55945180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档