当前位置:   article > 正文

浅谈sysfs系统--文件和目录的创建_zsfs文件为此系统的信息文件,在exit或quit的时候会自动创建在sfs_cache文件夹下。

zsfs文件为此系统的信息文件,在exit或quit的时候会自动创建在sfs_cache文件夹下。
sysfs是Linux的特殊文件系统,这个文件系统主要作用是在用户态展示设备的信息。
Linux计算机系统中,可以在 根目录下面找到sys目录,这个目录就是利用sysfs文件系统进行创建的。
打开sys目录,可以看到设备的分类显示,如下所示:
yxf@yxf-PC:sys$ ls
block bus class dev devices firmware fs hypervisor kernel module power
操作系统把设备分为block、bus、class、dev、devices、firmware、fs等目录。
Linux系统通过proc文件系统来管理内核的重要数据,但随着sysfs文件系统越来越重要,有些内核数据也通过sysfs文件系统来提供;proc因为本身的缺陷,越来越少被用到。
备注:
sys目录下不能创建和删除文件,因为sysfs文件系统没有提供创建和删除文件 功能。 和设备有关的另一个目录时dev目录,根目录下面的/dev目录设备文件只是代表一个符号,不包括设备相关信息。

文件和目录的创建

往期精彩回顾:

LINUX驱动开发中的红外(IRDA)程序

PCI设备驱动与虚拟网卡驱动源码分析

年薪60W的程序员都在看的Linux内核书籍

深度:一文看懂Linux内核!Linux内核架构和工作原理详解

sysfs 文件系统的初始化

sysfs文件系统提供了一个初始化函数sysfs_init来完成注册和初始化工作,代码如下:

  1. int __init sysfs_init(void)
  2. {
  3. int err = -ENOMEM;
  4. sysfs_dir_cachep = kmem_cache_create("sysfs_dir_cache",
  5. sizeof(struct sysfs_dirent),
  6. 0, 0, NULL);
  7. if (!sysfs_dir_cachep)
  8. goto out;
  9. err = sysfs_inode_init();
  10. if (err)
  11. goto out_err;
  12. err = register_filesystem(&sysfs_fs_type);
  13. if (!err) {
  14. sysfs_mnt = kern_mount(&sysfs_fs_type);
  15. if (IS_ERR(sysfs_mnt)) {
  16. printk(KERN_ERR "sysfs: could not mount!\n");
  17. err = PTR_ERR(sysfs_mnt);
  18. sysfs_mnt = NULL;
  19. unregister_filesystem(&sysfs_fs_type);
  20. goto out_err;
  21. }
  22. } else
  23. goto out_err;
  24. out:
  25. return err;
  26. out_err:
  27. kmem_cache_destroy(sysfs_dir_cachep);
  28. sysfs_dir_cachep = NULL;
  29. goto out;
  30. }

register_filesystem 和 kern_mount 分析过,把sysfs文件系统插入到文件系统的总链表中,然后为sysfs 文件系统创建一个vfsmount对象、根dentry 和 根inode 结构。

kmem_cache_create函数的作用是创建一个memory cache 对象。在第一章内核基础层一节分析过,创建一个slab对象,同时指定对象的大小,以后可以利用这个对象申请内存。

sysfs 文件系统提供函数sysfs_get_sb,创建文件系统超级块对象。sysfs_get_sb函数的实现和aufs文件系统一样,通过调用内核提供的get_sb_single创建超级块对象。sysfs调用get_sb_single时,提供sysfs_fill_super 函数作为sysfs文件系统超级块的赋值函数。 这个赋值函数和aufs的赋值函数类似

【文章福利】小编推荐自己的Linux内核源码交流群:【869634926】整理了一些个人觉得比较好的Linux内核学习书籍、视频资料共享在群里面,有需要的可以自行添加哦!

sysfs文件系统目录的创建

对于文件系统,关心文件和目录的创建删除 以及 读写

1)调用sysfs_create_dir 函数创建目录文件

sysfs文件系统使用sysfs_create_dir 函数创建目录文件:

  1. int sysfs_create_dir(struct kobject *kobj)
  2. {
  3. struct dentry *dentry = NULL;
  4. struct dentry *parent;
  5. int error = 0;
  6. BUG_ON(!kobj);
  7. /*设置父dentry,如果没有父dentry,指定文件系统的root dentry 为父 dentry */
  8. if(kobj->parent)
  9. parent = kobject->parent->dentry;
  10. else if (sysfs_mount && sys_mount->mnt_sb)
  11. parent = sysfs_mount->mnt_sb->s_root;
  12. else
  13. return -EFAULT;
  14. error = create_dir (kobj, parent, kobject_name(kobj), &dentry);
  15. if (!error)
  16. kobj->dentry = dentry;
  17. return error;
  18. }

  1. struct kobject {
  2. const char *name;
  3. struct list_head entry;
  4. struct kobject *parent;
  5. struct kset *kset;
  6. struct kobj_type *ktype;
  7. struct sysfs_dirent *sd;
  8. struct kref kref;
  9. unsigned int state_initialized:1;
  10. unsigned int state_in_sysfs:1;
  11. unsigned int state_add_uevent_sent:1;
  12. unsigned int state_remove_uevent_sent:1;
  13. unsigned int uevent_suppress:1;
  14. };

sysfs_create_dir的输入参数是一个kobject指针,结构kobject 和 sysfs 文件系统结合紧密 ,包含一个dentry指针。从第2章分析的知识点我们了解到,dentry代表着文件系统内部的层次关系,而包含dentry指针的结构kobject可以对应到sysfs文件系统的一个目录,这个dentry指针就是目录文件的dentry。

2) 调用create_dir 实际执行目录的创建

sysfs_create_dir调用create_dir实际执行目录的创建,代码如下:

  1. struct int create_dir( struct kobject * k , struct dentry * p , const char * n , struct dentry ** d )
  2. {
  3. int error;
  4. /* 指定是一个目录操作 */
  5. umode_t mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
  6. mutex_lock( & p->d_inode->i_mutex );
  7. *d = lookup_one_len(n, p, strlen(n));
  8. if (! IS_ERR(*d)) {
  9. /* 如果dirdent对象存在,退出返回错误,否则创建一个新的 dirent */
  10. if (sysfs_dirent_exist ( p->d_fsdata, n)
  11. error = -EEXIST;
  12. else
  13. error = sysfs_make_dirent( p->d_fsdata, *d, k, mode, SYSFS_DIR);
  14. ...
  15. }
  16. ...
  17. }

create_dir函数的第一部分是调用 lookup_one_len 在dentry cache 里面查找同名的 dentry 。 如果没有,则创建一个新的dentry。lookup_one_len函数前文已经分析。

新的结构:sysfs_dirent结构。对sysfs文件系统内的每一个目录和文件,都要为之创建一个sysfs_dirent对象。

3)调用sysfs_make_dirent函数创建一个sysfs_dirent结构

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/359492
推荐阅读
相关标签
  

闽ICP备14008679号