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

时间:2013-05-02 04:56:04

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

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

const char __user *buf

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

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

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

的内核驱动程序调用内核例程

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

可能有另一种方式,具体取决于您实际尝试调用的系统调用。

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