sysfs系统--文件和目录的创建
来源:互联网 发布:cf聊天软件下载 编辑:程序博客网 时间:2024/05/17 09:22
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目录设备文件只是代表一个符号,不包括设备相关信息。
4.1 文件和目录的创建
4.1.1 sysfs 文件系统的初始化
sysfs文件系统提供了一个初始化函数sysfs_init来完成注册和初始化工作,代码如下:
int __init sysfs_init(void)
{
int error = -ENOMEM;
sysfs_dir_cachep = kmem
}
int __init sysfs_init(void){int err = -ENOMEM;sysfs_dir_cachep = kmem_cache_create("sysfs_dir_cache", sizeof(struct sysfs_dirent), 0, 0, NULL);if (!sysfs_dir_cachep)goto out;err = sysfs_inode_init();if (err)goto out_err;err = register_filesystem(&sysfs_fs_type);if (!err) {sysfs_mnt = kern_mount(&sysfs_fs_type);if (IS_ERR(sysfs_mnt)) {printk(KERN_ERR "sysfs: could not mount!\n");err = PTR_ERR(sysfs_mnt);sysfs_mnt = NULL;unregister_filesystem(&sysfs_fs_type);goto out_err;}} elsegoto out_err;out:return err;out_err:kmem_cache_destroy(sysfs_dir_cachep);sysfs_dir_cachep = NULL;goto out;}
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的赋值函数类似
4.1.2 sysfs文件系统目录的创建
对于文件系统,关心文件和目录的创建、删除 以及 读写
1)调用sysfs_create_dir 函数创建目录文件
sysfs文件系统使用sysfs_create_dir 函数创建目录文件:
int sysfs_create_dir(struct kobject *kobj)
{
struct dentry *dentry = NULL;
struct dentry *parent;
int error = 0;
BUG_ON(!kobj);
/*设置父dentry,如果没有父dentry,指定文件系统的root dentry 为父 dentry */
if(kobj->parent)
parent = kobject->parent->dentry;
else if (sysfs_mount && sys_mount->mnt_sb)
parent = sysfs_mount->mnt_sb->s_root;
else
return -EFAULT;
error = create_dir (kobj, parent, kobject_name(kobj), &dentry);
if (!error)
kobj->dentry = dentry;
return error;
}
struct kobject {const char*name;struct list_headentry;struct kobject*parent;struct kset*kset;struct kobj_type*ktype;struct sysfs_dirent*sd;struct krefkref;unsigned int state_initialized:1;unsigned int state_in_sysfs:1;unsigned int state_add_uevent_sent:1;unsigned int state_remove_uevent_sent:1;unsigned int uevent_suppress:1;};
sysfs_create_dir的输入参数是一个kobject指针,结构kobject 和 sysfs 文件系统结合紧密 ,包含一个dentry指针。从第2章分析的知识点我们了解到,dentry代表着文件系统内部的层次关系,而包含dentry指针的结构kobject可以对应到sysfs文件系统的一个目录,这个dentry指针就是目录文件的dentry。
2) 调用create_dir 实际执行目录的创建
sysfs_create_dir调用create_dir实际执行目录的创建,代码如下:
struct int create_dir( struct kobject * k , struct dentry * p , const char * n , struct dentry ** d )
{
int error;
/* 指定是一个目录操作 */
umode_t mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
mutex_lock( & p->d_inode->i_mutex );
*d = lookup_one_len(n, p, strlen(n));
if (! IS_ERR(*d)) {
/* 如果dirdent对象存在,退出返回错误,否则创建一个新的 dirent */
if (sysfs_dirent_exist ( p->d_fsdata, n)
error = -EEXIST;
else
error = sysfs_make_dirent( p->d_fsdata, *d, k, mode, SYSFS_DIR);
...
}
...
}
create_dir函数的第一部分是调用 lookup_one_len 在dentry cache 里面查找同名的 dentry 。 如果没有,则创建一个新的dentry。lookup_one_len函数前文已经分析。
新的结构:sysfs_dirent结构。对sysfs文件系统内的每一个目录和文件,都要为之创建一个sysfs_dirent对象。
3)调用sysfs_make_dirent函数创建一个sysfs_dirent结构
4.1.3 普通文件的创建
4.2 sysfs文件的打开操作
4.2.1 为文件创建inode结构
4.2.2 为dentry结构绑定属性
4.2.4 调用文件系统的open函数
4.3 sysfs文件的读写
4.3.1 读文件的分析过程
4.3.2 写文件的过程分析
4.4 kobject结构
4.4.1 kobject 和 kset 的关系
4.4.2 kobject 实例:总线的祖册
4.5、小结
内核中的文件系统还有ramfs、 debugfs 、 configfs 、 proc 等
- sysfs系统--文件和目录的创建
- 为设备服务的文件系统sysfs--文件目录的创建
- SYSFS以及设备文件或kobject目录创建的关系
- SYSFS以及设备文件或kobject目录创建的关系
- sysfs创建目录:
- sysfs 创建属性文件的方法
- linux文件系统的系统分析--(六)sysfs下目录的创建
- linux文件系统的系统分析--(六)sysfs下目录的创建
- linux文件系统的系统分析--(六)sysfs下目录的创建
- linux sysfs中目录和文件节点的创建
- 创建文件和目录
- 创建文件和目录
- Linux那些事儿之我是Sysfs(10)sysfs 创建目录
- Linux那些事儿之我是Sysfs(10)sysfs 创建目录
- Linux那些事儿之我是Sysfs(10)sysfs 创建目录
- Linux那些事儿之我是Sysfs(10)sysfs 创建目录
- linux sysfs下创建文件
- java 创建文件和目录
- Dubbo配置文件
- Mysql-(Mysql5.7及以上版本)Access denied for user 'root'@'localhost' (using password:YES) 解决方案
- Hive 表增删改查CRUD操作
- 自己写的一个爬蚂蜂窝的景点数据的Python程序,Mark一下
- Linux的Docker上安装MySQL记录
- sysfs系统--文件和目录的创建
- Android上展示word、excel、pdf、ppt~
- ios-自动布局约束的问题
- Python--ImportError: No module named media
- android开发笔记之APK反编译(二) jadx
- User root is not allowed to impersonate anonymous
- 用户界面交互计算圆的周长和面积
- oracle合并列的函数wm_concat的使用详解
- java之接口与抽象