3

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

const char __user *buf

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

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

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

4

2 回答 2

5

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

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

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

于 2013-05-02T05:18:01.377 回答
5

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

这是一篇关于系统调用机制的文章。有一节解释了如何从内核空间调用系统调用,使用内核内存并避免验证。

  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 */
于 2013-05-02T05:23:17.320 回答