在Linux中如何从内核空间使用ioctl()?

在Linux中如何从内核空间使用ioctl()?,c,linux-kernel,C,Linux Kernel,是否可以从Linux内核模块调用ioctl? 有人能提供一个如何使用它的例子吗?您可以尝试调用sys\u ioctl 如果内核是使用CONFIG\u COMPAT编译的,则会导出它 或者,如果您拥有设备驱动程序的struct file\u操作,则可以直接调用其ioctl处理程序 但是,ioctl句柄希望指针参数位于当前运行的进程的地址空间中,而不是内核地址空间中从用户处复制将用于读取它们。如果向内核地址空间提供指针,copy\u from\u user将失败。我不知道你会怎么处理这件事 编辑:

是否可以从Linux内核模块调用
ioctl

有人能提供一个如何使用它的例子吗?

您可以尝试调用
sys\u ioctl

如果内核是使用
CONFIG\u COMPAT
编译的,则会导出它

或者,如果您拥有设备驱动程序的
struct file\u操作
,则可以直接调用其
ioctl
处理程序

但是,ioctl句柄希望指针参数位于当前运行的进程的地址空间中,而不是内核地址空间中<代码>从用户处复制将用于读取它们。如果向内核地址空间提供指针,
copy\u from\u user
将失败。我不知道你会怎么处理这件事

编辑:

如果您在下面的代码之间调用ioctl处理程序,则
从用户复制\u
将不会失败

 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 */

你真的不应该做那样的事。如果您进行搜索,您会发现如何从内核空间执行任意系统调用的代码在某种程度上依赖于实现,但请考虑是否有一种方法可以在不破坏模型的情况下实现真正的目标。文件中的ioctl处理程序已被弃用。你能想出使用ioctl的新方法吗?你能详细说明get_fs()和set_fs()是如何神奇地允许内核空间执行系统调用的,以及在“从_user()复制”之后是如何做到的吗不再产生问题?
set_fs
影响验证传递给
copy_to_user
的地址是否确实在当前用户的地址空间中的机制。它使内核认为当前地址空间就是内核地址空间。