来自内核空间的IOCTL

时间:2016-03-15 11:55:42

标签: random linux-kernel kernel kernel-module ioctl

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

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

1 个答案:

答案 0 :(得分:3)

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

因为ioctl命令RNDADDENTROPY是特定于文件的,所以它的处理应该在.unlocked_ioctl文件的/dev/random操作中实现(实际上它是以这种方式实现的,参见function {{3 }})。

对于特定于文件的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);