sysfs与ramfs、tmpfs、devtmpfs的一点区别

来源:互联网 发布:js eval 不能用 编辑:程序博客网 时间:2024/05/29 11:05
ramfs在挂载以后,其内部以dentry和inode为核心层次维护。
sysfs在挂载后,一般只会把挂载点的dentry和inode进行创建,并初始化该sys目录的inode->i_op为sysfs_dir_inode_operations.
这之后所有的sys下文件的读写访问操作,都需要经过look_up先找到文件路径,并逐一给每个目录建立inode与dentry,是个动态的过程,只有这个时候才会将sysfs_get_inode(inode层次关系到这里有回到了由sysfs_dirent来管理,回到最初的sysfs的构造),对所属的inode类型进行sysfs_init_inode操作,确定该文件或者目录的inode操作接口就被初始化为sysfs_dir_inode_operations或者sysfs_file_operations等
一旦存在dentry和inode后,会一直存在。

总的说明,sysfs先是自己一sysfs_dirent将kobject和kset维护起来,并在挂载以后只初始化化根目录sys inode的sysfs_dir_inode_operation. 通过不同的访问过程如读写操作,来逐一建立dentry和inode,统一到vfs模型后,就可以方便用户层的读写操作了。
猜测原因是:理论sysfs的inode是少量的,比dev肯定要少,所以没有进行静态的建立inode。

而对于ramfs而言,如tmpfs就是基于ramfs建立的,一旦加载/dev/以后也是先初始化dev目录根inode和dentry如
ramfs_dir_inode_operations。
而一旦执行mknod /dev/xxx会调用到vfs_mknod内部
 error = dir->i_op->mknod(dir, dentry, mode, dev);即为ramfs_dir_inode_operations->mknod

ramfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
{
     struct inode * inode = ramfs_get_inode(dir->i_sb, dir, mode, dev);//新建立一个inode节点并和设备信息绑定
     int error = -ENOSPC;

     if (inode) {
          d_instantiate(dentry, inode);
          dget(dentry);     /* Extra count - pin the dentry in core */
          error = 0;
          dir->i_mtime = dir->i_ctime = CURRENT_TIME;
     }
     return error;
}
这个过程是新建立一个设备文件节点,同时还生成了inode节点,并将设备节点相关的信息支持绑定到inode中,由init_special_inode初始化特殊设备节点到这里就又是统一到了vfs文件系统的标准。这个过程本质是静态的。对inode的处理的过程明显比sysfs来的直接明了,一般在Android系统中全部由uevent来负责完成mknod自动创建设备节点。

另外在内核启动时devtmpfs创建设备文件的节点过程也和tmpfs很类似。他是将会所有inode建立好以后再去mount,mount后设备文件节点将会具有所有的inode和dentry。

所依,总的来说linux内核对所有文件都进行了vfs化的操作,从而使得不同文件系统在上层的访问接口做到一致,而内核中就是以dentry和inode来体现的。经过inode再去分发处理为不同的文件操作类型。如sysfs设备属性文件,tmpfs下的字符设备文件、块设备文件等等。

0 0
原创粉丝点击