文件系统 结点 代码 初始化 目次 装备 时分 函数 遍历 结构 节点 属性 层次 用户 赋值 博客 空间 笼统 字段 媒介 全局 细致 模型 文件属性 本文 出处 定义 明显 成员 明天 兄弟 文件
linuxWen∴Jian∴Xi∴Tong∴Zhi∴sysfs------------------------------------------ 本文系本站原创!欢迎转载 转载请说明出处:http://ericxiao.cu博客.cn/ ------------------------------------------ 壹:媒介 正在装备模型中!sysfs文件系统用来表现装备的结构.将装备的层次结构笼统的反应到用户空间中.用户空间能够改正sysfs中的文件属性来改正装备的属性值!明天我们就来细致剖析壹下!sysfs的完成. 贰:sysfs的初始化和挂载 Sysfs文件系统的初始化是正在sysfs_init中完成的!代码以下: int __init sysfs_init int err = -ENOMEM。 //创立壹个分派sysfs_dirent的cache sysfs_dir_cachep = kmem_cache_create! 0! 0! NULL)。 if goto out。 err = sysfs_inode_init。 if goto out_err。 //注册sysfs文件系统s err = register_filesystem。 if //挂载sysfs文件系统 sysfs_mount = kern_mount。 if ) printk。 err = PTR_ERR。 sysfs_mount = NULL。 unregister_filesystem。 goto out_err。 else goto out_err。 out: return err。 out_err: kmem_cache_destroy。 sysfs_dir_cachep = NULL。 goto out。 每个kobject对应sysfs中的壹个目次!kobject的每个属性对应sysfs文件系统中的文件. struct sysfs_dirent就是用来做kobject与dentry的相互转换用的.它们的联系如所示: screen.width0.7) this.resized=true。 this.width=screen.width0.7。 this.alt=Click here to open new windownCTRL Mouse wheel to zoom in/out。" alt="" /gt。 上表现的是壹个kobject的层次结构.dentry的d_fsdata字段指定该结点所表现的sysfs_dirent.sysfs_dirent.s_parent表现它的父kobject. sysfs_dirent.s_sibling表现它的兄弟结点. sysfs_dirent.s_dir.children表现它所属的子节点. 从上可知.假设要遍历壹个结点下面的子结点!只需求找到sysfs_dirent.s_dir.children结点 然后按着子节点的s_sibling域遍历便可. 固然!有时分也需求从struct sysfs_dirent导出它所属的dentry结点.我们正在代码中遇到的时分再停止剖析. Sysfs文件系统的file_system_type定义以下: static struct file_system_type sysfs_fs_type = .name = "sysfs"! .get_sb = sysfs_get_sb! .kill_sb = kill_anon_super! 。 经过前面文件系统的相干剖析!我们知道正在sys_mount中终究会调用struct file_system_type的get_sb函数来完成文件系统的挂载.它的代码以下: static int sysfs_get_sb return get_sb_single。 get_sb_single的代码正在前面曾经触及到!它对super_block.和挂载的dentry和inode的赋值是正在回调函数sysfs_fill_super! mnt中完成的.代码以下: static int sysfs_fill_super struct inode inode。 struct dentry root。 sb-gt。s_blocksize = PAGE_CACHE_SIZE。 sb-gt。s_blocksize_bits = PAGE_CACHE_SHIFT。 sb-gt。s_magic = SYSFS_MAGIC。 sb-gt。s_op = sysfs_ops。 sb-gt。s_time_gran = 1。 sysfs_sb = sb。 / get root inode! initialize and unlock it / inode = sysfs_get_inode。 if pr_debug。 return -ENOMEM。 / instantiate and link root dentry / root = d_alloc_root。 if pr_debug。 iput。 return -ENOMEM。 //将sysfs_root关联到root root-gt。d_fsdata = http://博客.soso.com/qz.q/sysfs_root。 sb-gt。s_root = root。 return 0。 正在这里要留心几个全局量. sysfs_sb表现sysfs文件系统的super_block. sysfs_root表现sysfs文件系统根目次的struct sysfs_dirent. sysfs_get_inode用来将sysfs_root导出响应的inode.代码以下: struct inode sysfs_get_inode struct inode inode。 //以super_block和sd-gt。s_ino为哈希值!到哈希表中寻觅响应的inode.假设不具有!则新建 inode = iget_locked。 //对更天生的inode停止初始化 if ) sysfs_init_inode。 return inode。 起首!它以sysfs文件系统的super_block和struct sysfs_dirent.的s_ino成员的值做为哈希值到哈希表中寻觅响应的inode.假设正在哈希表中不具有这个inode!那就新建壹个!并将它链进到哈希表.以后!调用sysfs_init_inode对天生的inode停止初始化.明显.正在mount的时分是不会天生inode的.肯定会进进sysfs_init_inode函数.代码以下:------------------------------------------本文系本站原创!欢迎转载 转载请说明出处:http://ericxiao.cu
飞扬黑客网 http://www.gdwkb.cn
linuxWen∴Jian∴Xi∴Tong∴Zhi∴sysfs------------------------------------------ 本文系本站原创!欢迎转载 转载请说明出处:http://ericxiao.cu博客.cn/ ------------------------------------------ 壹:媒介 正在装备模型中!sysfs文件系统用来表现装备的结构.将装备的层次结构笼统的反应到用户空间中.用户空间能够改正sysfs中的文件属性来改正装备的属性值!明天我们就来细致剖析壹下!sysfs的完成. 贰:sysfs的初始化和挂载 Sysfs文件系统的初始化是正在sysfs_init中完成的!代码以下: int __init sysfs_init int err = -ENOMEM。 //创立壹个分派sysfs_dirent的cache sysfs_dir_cachep = kmem_cache_create! 0! 0! NULL)。 if goto out。 err = sysfs_inode_init。 if goto out_err。 //注册sysfs文件系统s err = register_filesystem。 if //挂载sysfs文件系统 sysfs_mount = kern_mount。 if ) printk。 err = PTR_ERR。 sysfs_mount = NULL。 unregister_filesystem。 goto out_err。 else goto out_err。 out: return err。 out_err: kmem_cache_destroy。 sysfs_dir_cachep = NULL。 goto out。 每个kobject对应sysfs中的壹个目次!kobject的每个属性对应sysfs文件系统中的文件. struct sysfs_dirent就是用来做kobject与dentry的相互转换用的.它们的联系如所示: screen.width0.7) this.resized=true。 this.width=screen.width0.7。 this.alt=Click here to open new windownCTRL Mouse wheel to zoom in/out。" alt="" /gt。 上表现的是壹个kobject的层次结构.dentry的d_fsdata字段指定该结点所表现的sysfs_dirent.sysfs_dirent.s_parent表现它的父kobject. sysfs_dirent.s_sibling表现它的兄弟结点. sysfs_dirent.s_dir.children表现它所属的子节点. 从上可知.假设要遍历壹个结点下面的子结点!只需求找到sysfs_dirent.s_dir.children结点 然后按着子节点的s_sibling域遍历便可. 固然!有时分也需求从struct sysfs_dirent导出它所属的dentry结点.我们正在代码中遇到的时分再停止剖析. Sysfs文件系统的file_system_type定义以下: static struct file_system_type sysfs_fs_type = .name = "sysfs"! .get_sb = sysfs_get_sb! .kill_sb = kill_anon_super! 。 经过前面文件系统的相干剖析!我们知道正在sys_mount中终究会调用struct file_system_type的get_sb函数来完成文件系统的挂载.它的代码以下: static int sysfs_get_sb return get_sb_single。 get_sb_single的代码正在前面曾经触及到!它对super_block.和挂载的dentry和inode的赋值是正在回调函数sysfs_fill_super! mnt中完成的.代码以下: static int sysfs_fill_super struct inode inode。 struct dentry root。 sb-gt。s_blocksize = PAGE_CACHE_SIZE。 sb-gt。s_blocksize_bits = PAGE_CACHE_SHIFT。 sb-gt。s_magic = SYSFS_MAGIC。 sb-gt。s_op = sysfs_ops。 sb-gt。s_time_gran = 1。 sysfs_sb = sb。 / get root inode! initialize and unlock it / inode = sysfs_get_inode。 if pr_debug。 return -ENOMEM。 / instantiate and link root dentry / root = d_alloc_root。 if pr_debug。 iput。 return -ENOMEM。 //将sysfs_root关联到root root-gt。d_fsdata = http://博客.soso.com/qz.q/sysfs_root。 sb-gt。s_root = root。 return 0。 正在这里要留心几个全局量. sysfs_sb表现sysfs文件系统的super_block. sysfs_root表现sysfs文件系统根目次的struct sysfs_dirent. sysfs_get_inode用来将sysfs_root导出响应的inode.代码以下: struct inode sysfs_get_inode struct inode inode。 //以super_block和sd-gt。s_ino为哈希值!到哈希表中寻觅响应的inode.假设不具有!则新建 inode = iget_locked。 //对更天生的inode停止初始化 if ) sysfs_init_inode。 return inode。 起首!它以sysfs文件系统的super_block和struct sysfs_dirent.的s_ino成员的值做为哈希值到哈希表中寻觅响应的inode.假设正在哈希表中不具有这个inode!那就新建壹个!并将它链进到哈希表.以后!调用sysfs_init_inode对天生的inode停止初始化.明显.正在mount的时分是不会天生inode的.肯定会进进sysfs_init_inode函数.代码以下:------------------------------------------本文系本站原创!欢迎转载 转载请说明出处:http://ericxiao.cu
飞扬黑客网 http://www.gdwkb.cn


