从内核模块创建一个shm文件

时间:2017-06-06 20:02:56

标签: c linux-kernel ipc shared-memory kernel-module

我正在尝试打开一个shm文件,用于内核和用户进程之间的数据共享。 下面是我的内核模块代码。系统日志输出表明未遇到任何错误。加载模块后,我没有看到我尝试在/ dev / shm中创建的文件。我做错了什么?

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/shmem_fs.h>

static int __init moduleLoader(void) {
    struct file *shfile;

    printk(KERN_INFO "shkmod is loading...\n");

    shfile = shmem_file_setup("MyShmFile",sizeof(int),0);
    printk("shmem_file_setup returned %p\n",shfile);
    if (IS_ERR(shfile))
        printk("shmem_file_setup returned error.\n");
    printk("shfile is: %s\n", shfile->f_path.dentry->d_name.name);

    printk(KERN_INFO "shkmod is done loading.\n");
    return 0;
}

static void __exit moduleUnloader(void) {
    printk(KERN_INFO "shkmod was unloaded.\n");
    return;
}

module_init(moduleLoader);
module_exit(moduleUnloader);

MODULE_AUTHOR("Yaron Shragai");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Lorem ipsum dolor sit amet");

以下是sys日志中的输出:

Jun  6 15:25:59 yaron-VirtualBox kernel: [457160.335482] shkmod is loading...
Jun  6 15:25:59 yaron-VirtualBox kernel: [457160.335487] shmem_file_setup returned ffff8801fef53b00
Jun  6 15:25:59 yaron-VirtualBox kernel: [457160.335488] shfile is: MyShmFile
Jun  6 15:25:59 yaron-VirtualBox kernel: [457160.335488] shkmod is done loading.

$ uname -a
Linux yaron-VirtualBox 4.4.0-57-generic#78-Ubuntu SMP Fri Dec 9 23:50:32 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux

1 个答案:

答案 0 :(得分:1)

/**
 * shmem_file_setup - get an unlinked file living in tmpfs

评论明确指出该文件不会出现在任何地方。

 * @name: name for dentry (to be seen in /proc/<pid>/maps

...而且名称是要在地图中显示的内容。

 * @size: size to be set for the file
 * @flags: VM_NORESERVE suppresses pre-accounting of the entire object size
 */
struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags)
{
        return __shmem_file_setup(name, size, flags, 0);
}

虽然有道理。您没有指定任何文件系统,只使用了一个相对路径开头的名称。为什么你希望文件专门出现在/ dev中?

与往常一样,真正的问题是你正在处理的实际问题是什么。

如果碰巧共享文件确实是要走的路,那么用户空间应该创建一个并告诉内核使用它。