2016-03-15 117 views
0

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

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

回答

2

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

因为ioctl命令RNDADDENTROPY是文件特定的,其处理应在.unlocked_ioctl操作来实现对/dev/random文件(和它实际上是实现这种方式,请参阅功能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); 
+0

谢谢回答。出于好奇:如果在不同文件名下的“/ dev/random”会发生什么?有没有办法绕过'ioctl'调用并将数据添加到熵池?我检查了'random.c',但函数'write_pool'没有被导出。 – insumity

+0

该文件有一些导出的函数,如[add_device_randomness](http://lxr.free-electrons.com/source/drivers/char/random.c#L759)。可能你会发现其中一些有用于你的目的。至于'write_pool',写入文件时会间接调用它。 – Tsyvarev