Linux内核4.15中的路径查找

问题描述 投票:1回答:1

我正试图编写一个简单的内核模块,仅用于教学目的。特别是让我头疼的是路径查找。我想要一个sysfs条目,并且在存储操作中,我想接收一个缓冲区,并且仅当它是有效路径时才想保存它。因此,我尝试从此处namei.c使用vfs_path_lookup导出的符号。但是,即使插入有效路径,它也会向我显示ENOENT错误。

这是我的代码:

进入标题:

extern int vfs_path_lookup(struct dentry *, struct vfsmount *, const char *, unsigned int, struct path *path);

进入模块存储功能:

ssize_t path_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count){

            int err = vfs_path_lookup(current->fs->root.dentry, current->fs->root.mnt, buf, LOOKUP_DIRECTORY, base_path);
            printk(KERN_DEBUG "%s\n", __FUNCTION__);
            printk(KERN_DEBUG "Received: %s err is %d\n", buf, err);        

            strncpy(base_addr, buf, MAX_FILENAME_SIZE);
            printk(KERN_DEBUG "Base Addr: %s\n", base_addr);
            return strlen(base_addr);
        }

我试图写入文件的是字符串“ / home / osboxes / Documents”,它是一个现有目录。我怀疑我没有真正使用该功能,可能带有标志。预先感谢您的帮助。

编辑:这是请求注释的示例(再次感谢)

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/namei.h>
#include <linux/slab.h>
#include <linux/err.h>
#include <linux/kobject.h> 
#include <linux/sysfs.h>



#define MAX_FILENAME_SIZE 256

struct path *base_path ;
struct kobject *conf_kobj;
char base_addr[MAX_FILENAME_SIZE] = "/home/osboxes/Documenti";

struct kobj_attribute *get_attribute(char *name, umode_t mode, ssize_t (*show)(struct kobject *, struct kobj_attribute *, char *), ssize_t (*store)(struct kobject *, struct kobj_attribute *,
             const char *, size_t));

ssize_t path_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf){
                printk(KERN_DEBUG "%s\n", __FUNCTION__);

                return sprintf(buf, "%s", base_addr);
            }
ssize_t path_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count){

                int err = kern_path(buf, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, base_path);
                printk(KERN_DEBUG "%s\n", __FUNCTION__);
                printk(KERN_DEBUG "Received: %s err is %d\n", buf, err);        

                strncpy(base_addr, buf, MAX_FILENAME_SIZE);
                printk(KERN_DEBUG "Base Addr: %s\n", base_addr);
                return strlen(base_addr);
            }



static int __init init_mymodule(void)
{   
    struct kobj_attribute *path_attr;

    printk(KERN_DEBUG "Module inserted\n");

    path_attr = get_attribute(base_addr, 0666, path_show, path_store);
    base_path = kmalloc(sizeof(struct path), GFP_KERNEL);

    conf_kobj = kobject_create_and_add("conf", kernel_kobj);


    sysfs_create_file(conf_kobj, &path_attr->attr);

    return 0;

}



struct kobj_attribute *get_attribute(char *name, umode_t mode, ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr, char *buf), ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
             const char *buf, size_t count))
{
    struct kobj_attribute *attribute = kmalloc(sizeof(struct kobj_attribute), GFP_KERNEL);

    attribute->attr.name = name;
    attribute->attr.mode = mode;
    if(show)
        attribute->show = show;
    if(store)
        attribute->store = store;
    return attribute;

}

static void __exit exit_mymodule(void)
{

    kobject_put(conf_kobj);
    kfree(base_addr);
    printk(KERN_INFO "Module removed\n");
}



module_init(init_mymodule);
module_exit(exit_mymodule);

MODULE_LICENSE("GPL");

我还按照@Tsyvarev的建议,用kern_path替换了vfs_path_lookup。当我写到终端时出现错误

echo "/home/osboxes/Documenti" > /sys/kernel/conf/path

当我在“ buf”变量中使用地址时,在这种情况下,它是硬编码的,但是不起作用。

我正试图编写一个简单的内核模块,仅用于教学目的。特别是让我头疼的是路径查找。我想要一个sysfs条目,并在我想要的存储操作中...

linux linux-kernel kernel linux-device-driver kernel-module
1个回答
0
投票

我解决了问题,我存储了无效的路径,因为“ store”方法在字符串的末尾添加了换行符。谢谢大家

© www.soinside.com 2019 - 2024. All rights reserved.