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

Var*_*ári 6 c linux-kernel

是否可以ioctl从Linux内核模块调用?任何人都可以举例说明它是如何使用的吗?

ugo*_*ren 6

你可以尝试打电话sys_ioctl.
如果使用编译内核,则导出它CONFIG_COMPAT.

或者,如果您有设备驱动程序struct file_operations,则可以ioctl直接调用其处理程序.

但是,ioctl句柄会指望指针参数位于当前运行的进程的地址空间中,而不是内核地址空间中.copy_from_user会被用来读它们.如果指向内核地址空间,copy_from_user则会失败.我不知道你会怎么解决这个问题.

编辑:

如果你将在下面的代码之间调用ioctl处理程序copy_from_user而不会失败.

 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 */
Run Code Online (Sandbox Code Playgroud)