如何在内核驱动程序中分配用户空间缓冲区?

问题描述:

在一些混乱中,我需要调用一个内核函数,它不会从内核空间调用,因为它在参数中占用了分配的用户空间的缓冲区。如何在内核驱动程序中分配用户空间缓冲区?

const char __user *buf 

但我需要调用,那么如何分配用户空间缓冲区并将其传递给函数参数。

如果可能的话,那么我需要做到这一点,没有任何用户空间的互动。 真的有可能吗?

我的目标是调用从谁接受参数const char __user *buf

+1

实际上你是否需要将缓冲区放在用户空间中,还是只想调用一个内核例程,该例程不向内核调用方提供接口。 – 2013-05-02 04:58:26

+0

我需要调用那个接受参数的内核例程“const char __user * buf” – 2013-05-02 05:01:06

+0

如果你需要这样做,你做错了。 – gby 2013-05-02 05:09:54

可能还有其他方法,具体取决于您实际尝试调用的系统调用。

这是一个article,它解释了一些关于系统调用机制的内容。有一节介绍如何从内核空间调用系统调用,使用内核内存并避免验证。

mm_segment_t fs; 

    fs = get_fs();  /* save previous value */ 
    set_fs (get_ds()); /* use kernel limit */ 

    /* system calls can be invoked */ 

    set_fs(fs); /* restore before returning to user space */ 
+0

是啊谢谢这工作对我来说... – 2013-05-02 05:53:49

+0

确定。我仍然希望你更新你的问题来描述你正在尝试的系统调用。根据这些信息,可能有更好的方法来实现你想要的。 – Anthony 2013-05-02 06:01:31

AFAIK内核驱动程序内核程序,通常的方式做到这一点是打破内核例程有两种 - 外部例程与系统调用力学交易,手柄copyin()/ coyout()等,然后调用实际工作的内部例程。

当然,如果您需要将代码自包含在模块中,并且不控制与其一起使用的内核的其余部分,那么这将不起作用。

并回答你的具体问题 - 我不知道是否有任何这样的API,但我相当怀疑它。