【问题标题】:How to allocate user space buffer in kernel driver?如何在内核驱动程序中分配用户空间缓冲区?
【发布时间】:2013-05-02 13:30:18
【问题描述】:

在一些混乱中,我需要调用一个不应该从内核空间调用的内核函数,因为在参数中它从分配的用户空间中获取缓冲区。

const char __user *buf

但是我需要调用它,所以我如何分配用户空间缓冲区并使用该函数参数传递它。

如果可能的话,我需要在没有任何用户空间交互的情况下这样做。 真的有可能吗?

我的目标是从接受参数const char __user *buf的内核驱动程序调用内核例程

【问题讨论】:

  • 您是否真的需要将缓冲区放在用户空间中,或者您只是想调用一个不向内核调用者提供接口的内核例程。
  • 我需要调用接受参数“const char __user *buf”的内核例程
  • 如果你需要这样做,那你就错了。
  • 是哪个函数?也许有人可以提出替代方案。

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

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

这是一个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 */

【讨论】:

  • 好的。我仍然希望您更新您的问题以描述您尝试进行的系统调用。根据这些信息,可能有更好的方法来实现您想要的。
【解决方案2】:

AFAIK,通常的做法是将内核例程分成两部分 - 一个处理系统调用机制的外部例程,处理 copyin()/coyout() 等,然后调用内部例程,它做实际的工作。

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

回答您的具体问题 - 我不知道是否有任何此类 API,但我对此表示怀疑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2013-01-30
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多