内核模块从用户空间获取数据



在不使用netlink和不使用可能不到位的功能(例如debugfs)的情况下,向加载并运行的内核模块发送一些数据的正确方式是什么?

我希望看到一种干净、安全的方法来做到这一点,它应该适用于大多数内核(最好是所有现代内核),或者充其量是一种近似的方法。

想要向模块发送数据的用户是根用户,数据量可能低于64kiB,并且由一系列字符串组成。

我已经考虑过从模块中读取文件,这不仅因为各种原因而受到强烈反对,而且很难做到。我看过netlink,socket()在我的内核上告诉我它不受支持。我已经研究了debugfs,它在我的内核上也不受支持。

很明显,我可以使用不同的内核,但正如我所提到的,我想要一种正确的方式来做到这一点。如果有人能给我看一个简单的模块示例,它只会打印从用户空间发送的字符串(),那就太好了。

。。。一个简单的模块示例,它只会对从用户空间发送的字符串执行printk()操作,printkm.c:

#include <linux/module.h>
#include <linux/proc_fs.h>
MODULE_DESCRIPTION("printk example module");
MODULE_AUTHOR("Dietmar.Schindler@manroland-web.com");
MODULE_LICENSE("GPL");
static
ssize_t write(struct file *file, const char *buf, size_t count, loff_t *pos)
{
    printk("%.*s", count, buf);
    return count;
}
static struct file_operations file_ops;
int init_module(void)
{
    printk("init printk example modulen");
    struct proc_dir_entry *entry = proc_create("printk", 0, NULL, &file_ops);
    if (!entry) return -ENOENT;
    file_ops.owner = THIS_MODULE,
    file_ops.write = write;
    return 0;
}
void cleanup_module(void)
{
    remove_proc_entry("printk", NULL);
    printk("exit printk example modulen");
}

示例用法:

root@kw:~# insmod printkm.ko
root@kw:~# echo a string >/proc/printk 
root@kw:~# dmesg|tail -1
[193634.164459] a string

我认为您可以使用char设备。看看Linux设备驱动程序第3章。使用*copy_to_user*和*copy_from_user*功能,您可以安全地将数据复制到用户空间和从用户空间复制数据。

相关内容

  • 没有找到相关文章

最新更新