我正在尝试打开一个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
答案 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中?
与往常一样,真正的问题是你正在处理的实际问题是什么。
如果碰巧共享文件确实是要走的路,那么用户空间应该创建一个并告诉内核使用它。