0

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

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

想要向模块发送数据的用户是root用户,数据量大概在64 kiB以下,由一系列字符串组成。

我已经考虑过尝试从模块中读取文件,这不仅由于各种原因而受到高度反对,而且很难做到。我查看了 netlink,socket() 告诉我我的内核不支持。我查看了 debugfs,我的内核也不支持它。

显然我可以使用不同的内核,但正如我所提到的,我想要一种正确的方法来做到这一点。如果有人可以向我展示一个简单的模块示例,该模块将只对从用户空间发送的字符串执行 printk(),那就太好了。

4

2 回答 2

2

... 一个简单的模块示例,它只对从用户空间发送的字符串 printk() 执行 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 module\n");
    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 module\n");
}

示例使用:

root@kw:~# insmod printkm.ko
root@kw:~# echo a string >/proc/printk 
root@kw:~# dmesg|tail -1
[193634.164459] a string
于 2014-04-24T11:03:20.010 回答
0

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

于 2012-08-04T00:42:19.647 回答