【问题标题】:IOCTL from kernel space来自内核空间的 IOCTL
【发布时间】:2016-06-30 20:32:33
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    由于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);
    

    【讨论】:

    • 感谢您的回答。出于好奇:如果“/dev/random”在不同的文件名下会发生什么?有没有办法绕过ioctl 调用并将数据添加到熵池?我检查了random.c,但没有导出函数write_pool
    • 该文件中有一些导出的函数,例如add_device_randomness。可能您会发现其中一些对您的目的有用。至于write_pool,写入文件时会间接调用。
    猜你喜欢
    • 2011-07-17
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2011-02-11
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多