来自内核的 IOCTL space

IOCTL from kernel space

粗略地说,我试图从内核 space 发出一个 IOCTL 调用,而不去用户 space。 (我在 SO 中找到的所有答案都建议通过用户 space)。

具体来说,我尝试从内核 space(使用内核模块)填充熵池 (/dev/random) [我知道这样做的危险 ;)]。使用 IOCTL 填充用户 space 的熵池,例如 rngaddentropy。有没有办法从内核做同样的事情 space?

您也可以使用内核中的 ioctl space。

因为ioctl命令RNDADDENTROPY是文件特定的,它的处理应该在对/dev/random文件的.unlocked_ioctl操作中实现(实际上是这样实现的,见函数random_ioctl).

对于特定于文件的 ioctl 命令,您可以直接调用 .unlocked_ioctl 文件的操作:

// Open file
struct file* f = filp_open("/dev/random", O_WRONLY, 0);
// Replace user space with kernel space
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);

f->f_op->unlocked_ioctl(f, RNDADDENTROPY, entropy);

// Restore space
set_fs(old_fs);

// Close file
filp_close(f, 0);