http://blog.csdn.net/dndxhej/article/details/7434615

对sysfs和设备模型有了解的都会知道sysfs实际是为了将设备模型导出到用户空间的一个内存文件系统。

设备模型的关键结构体kobject会组成设备模型的树形结构,而sysfs的关键结构体sysfs_dirent也是类似的树形的结构,vfs中的dentry同样是类似的树形结构。

sysfs目录文件的创建都是由设备模型的上层构件(bus device driver class)在注册的时候调用它们内含的kobject(设备模型的底层基石)的添加注册操作,而kobject的操作就调用sysfs文件系统的具体操作

这些结构体是有联系的,但这一次我们先不过度关注他们的联系,仅仅对sysfs下目录和文件的创建做个分析:

kobject结构体:

 struct kobject {
const char *name;
struct list_head entry;
struct kobject *parent;
struct kset *kset;
struct kobj_type *ktype;
struct sysfs_dirent *sd;
struct kref kref;
unsigned int state_initialized:;
unsigned int state_in_sysfs:;
unsigned int state_add_uevent_sent:;
unsigned int state_remove_uevent_sent:;
unsigned int uevent_suppress:;
};

sysfs_dirent结构中的union有四项:目录(s_dir)、链接文件(s_symlink),属性文件(s_attr)和二进制属性文件(s_bin_attr)。

struct sysfs_dirent {
atomic_t s_count;
atomic_t s_active;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
struct sysfs_dirent *s_parent;
struct sysfs_dirent *s_sibling;
const char *s_name; union {
struct sysfs_elem_dir s_dir;
struct sysfs_elem_symlink s_symlink;
struct sysfs_elem_attr s_attr;
struct sysfs_elem_bin_attr s_bin_attr;
}; unsigned int s_flags;
unsigned short s_mode;
ino_t s_ino;
struct sysfs_inode_attrs *s_iattr;
};

我们vfs中有inode和entry两种关键的对象,在很多文件系统的设计中,都会有类似omfs_inode和omfs_extent_entry等等结构体来抽象表明具体文件系统的节点和目录项。

而在sysfs中,不管是目录还是文件,都用同一个结构体sysfs_dirent来表示,这个结构体可以说是inode和dentry的综合,因为有:

 unsignedint s_flags;
unsignedshort s_mode;
ino_t s_ino;

等类似于inode的内容,也有:

 structsysfs_dirent *s_parent;
structsysfs_dirent *s_sibling;
constchar *s_name;

等类似于dentry的内容。

总的来说,sysfs_dirent结构体是sysfs和kobject建立连接的桥梁。

我们知道,kobject对应于sysfs下的一个目录:

 structsysfs_elem_dir {
structkobject *kobj;
/*children list starts here and goes through sd->s_sibling */
structsysfs_dirent *children;
};

上面的结构体紧密的将kobject和sysfs_dirent联系起来。kobject代表目录,而对于代表目录的sysfs_dirent,内嵌的sysfs_elem_dir有kobject的指针,所以kobject和sysfs_dirent是你中有我,我中有你。

不过对于文件就不一样了,因为文件也有自己的sysfs_dirent,而文件并没有自己的kobject。

在普通的文件系统中,比如omfs中,建立一个目录的话,首先会从物理存储介质(磁盘)中读取相关信息填充omfs下的omfs_inode结构体,然后会建立vfs层的inode和dentry等结构体。

而在sysfs中,在建立目录和文件时,只会通过sysfs_dirent结构体来建立目录文件的层次结构,而看不到vfs中的dentry、inode。既然是linux下的文件系统,不管多么特殊,肯定要有inode和dentry的,sysfs文件系统也不例外,只不过sysfs将建立inode和dentry的操作推到sysfs_lookup函数中来做,在sysfs_lookup中还会建立dentry与sysfs_dirtnt的关系。dentry->d_fsdata= sysfs_get(sd);

其实这个关系,在sysfs_fill_super就有体现:root->d_fsdata= &sysfs_root;

 struct sysfs_dirent sysfs_root = {
.s_name = "",
.s_count = ATOMIC_INIT(),
.s_flags = SYSFS_DIR,
.s_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
.s_ino = ,
};

这个sysfs_root就是sysfs_dirent层次结构中的根。

下面是sysfs创建目录的过程,注意的是这个过程只能通过kobject的操作来实现,在/sys下用mkdir是没作用的:

 int sysfs_create_dir(struct kobject * kobj)
{
struct sysfs_dirent *parent_sd, *sd;
int error = ; BUG_ON(!kobj); if (kobj->parent)
parent_sd = kobj->parent->sd;
else
parent_sd = &sysfs_root; error = create_dir(kobj, parent_sd, kobject_name(kobj), &sd);
if (!error)
kobj->sd = sd;
return error;
}
 static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
const char *name, struct sysfs_dirent **p_sd)
{
umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
struct sysfs_addrm_cxt acxt;
struct sysfs_dirent *sd;
int rc; /* allocate */
sd = sysfs_new_dirent(name, mode, SYSFS_DIR); //初始化sysfs_dirent结构体
if (!sd)
return -ENOMEM;
sd->s_dir.kobj = kobj; //sysfs_dirent与kobject的联系建立 /* link in */
sysfs_addrm_start(&acxt, parent_sd);
rc = sysfs_add_one(&acxt, sd);
sysfs_addrm_finish(&acxt); if (rc == )
*p_sd = sd;
else
sysfs_put(sd);
return rc;
}

在sysfs_add_one是层次关系的建立:

 int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
{
struct sysfs_inode_attrs *ps_iattr; if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
return -EEXIST; sd->s_parent = sysfs_get(acxt->parent_sd); //建立上下层次间的父子关系 sysfs_link_sibling(sd); //建立同一层次的兄弟关系 /* Update timestamps on the parent */
ps_iattr = acxt->parent_sd->s_iattr;
if (ps_iattr) {
struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
} return ;
}

在sysfs_link_sibling中关键代码:

     for (pos = &parent_sd->s_dir.children; *pos; pos = &(*pos)->s_sibling) {
if (sd->s_ino < (*pos)->s_ino)
break;
}

根据s_ino从小到大的顺序组成一个链。附上一个图,这个关系就一目了然:

从这个图可以很清楚的看到sysfs中sysfs_dirent架成的树形结构(注意他们的s_ino排列),这个结构和kobject,dentry的树形结构几乎一致,因为他们是有联系的,后面我们会一步步理清他们的联系,到时侯就明白sysfs是如何将设备模型(kobject)倒成文件系统的。

sysfs文件系统的建立【转】的更多相关文章

  1. Linux设备模型——设备驱动模型和sysfs文件系统解读

    本文将对Linux系统中的sysfs进行简单的分析,要分析sysfs就必须分析内核的driver-model(驱动模型),两者是紧密联系的.在分析过程中,本文将以platform总线和spi主控制器的 ...

  2. sysfs文件系统学习--sysfs

    一.sysfs简介1.sysfs就是利用VFS的接口去读写kobject的层次结构,建立起来的文件系统.其更新与删除是那些xxx_register()/unregister()做的事 情.从sysfs ...

  3. Sysfs文件系统与Linux设备模型

    转:http://www.360doc.com/content/11/1218/16/1299815_173168170.shtml sysfs把连接在系统上的设备和总线组织成为一个分级的目录及文件, ...

  4. proc文件系统、sysfs文件系统、kobject操作

    Proc文件系统是提供一个接口给用户,让用户可以查看系统运行的一些状态信息,让用户修改内核的一些参数,比方说printk的打印级别就可以通过proc去修改 Sysfs文件系统, Sysfs is a ...

  5. [中英对照]The sysfs Filesystem | sysfs文件系统

    The sysfs Filesystem | sysfs文件系统 Abstract | 摘要 sysfs is a feature of the Linux 2.6 kernel that allow ...

  6. 概述sysfs文件系统【转】

    转自:http://blog.csdn.net/npy_lp/article/details/78933292 内核源码:linux-2.6.38.8.tar.bz2 目标平台:ARM体系结构 sys ...

  7. sysfs文件系统

    3 sysfs文件系统 sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用.该文件系统的目录层次结构严格按照内核的数据结构组织.除了二进制文件外(只有特殊场合才使用 ...

  8. Linux 内核sysfs 文件系统符号连接

    sysfs 文件系统有通常的树结构, 反映它代表的 kobjects 的层次组织. 但是内核中对象 间的关系常常比那个更加复杂. 例如, 一个 sysfs 子树 (/sys/devices )代表所有 ...

  9. qt-5.6.0 移植之qt文件系统的建立

    经过差不多两个星期的奋斗,终于在板子里面跑起来了qt 程序,虽然现在还没有把触摸屏驱动加上去,但是我相信已经不远了!!!!! 在前两篇的随笔里面 , 已经编译好了最纯净的文件系统以及交叉编译完成了qt ...

随机推荐

  1. volatile 关键字了解与使用

    前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能. 首先来看看为什么会出现这个关键字. 内存可见性 由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个 ...

  2. IMSI

    国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有 ...

  3. cropper实现图片剪切上传

    一.引入文件 <script src="jquery.min.js"></script> <link rel="stylesheet&quo ...

  4. Java 范例 - 字节处理

    前言 Java 编程中常会遇到需要进行字节处理的地方,本篇文章就来探讨编程中会遇到的字节处理问题. 字节序 字节序(endianness)是对于多字节数据来说的,它描述了多字节数据存储的顺序,分为大端 ...

  5. Spring Boot 解决方案 - 会话

    连接无状态 使用 HTTP 的连接是无状态的,因此为了应对需要状态的服务例如用户登录,诞生了适合保存状态的设计-会话(session),本文就来探讨一下会话. 会话的使用 Spring Mvc 中使用 ...

  6. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十五):Spring Security 版本

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 到目前为止,我们使用的权限认证框架是 Shiro,虽然 Shiro ...

  7. 团队作业4——beta阶段冲刺

    Deadline: 2018-12-16 22:00PM,以博客提交至班级博客时间为准 提交: (a) 项目课堂演示: (b) 1篇冲刺准备+5篇冲刺随笔,: (c) 1篇用户使用用报告: (d) 1 ...

  8. Struts2学习(六)———— 文件上传和下载

    一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相应的处理,而在struts2中就不需要了,因为有一个fileUpload拦截器帮 ...

  9. Java基础之基础语法

    前言:Java内功心法之基础语法,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 一个Java程序可以认为是一系列对象的集合,而这些对象通过调 ...

  10. jQuery学习(1)猜数字游戏

      jQuery是一个快捷.小型且特征丰富的JavaScript库.它使得HTML文档遍历及操作,事件处理,动画,Ajax等更简洁方便.它通过调用一个简单易用的API,就能在各种浏览器中使用.由于jQ ...