sysfs文件系统之初始化
来源:互联网 发布:手机相机滤镜软件 编辑:程序博客网 时间:2024/05/21 06:33
------------------------------------------------ #纯属个人理解,如有问题敬请谅解!#kernel version: 2.6.26#Author: andy wang------------------------------------------------- sysfs文件系统和procfs类似,也是一种内存文件系统, 它不仅能提供内核信息查看和配置功能,在Linux 中它还有一个重要的功能,就是为linux设备模型提供统一的管理. 如果要深入研究linux设备模型,那就要先从sysfs入手. sysfs初始化 sysfs文件系统默认是被编译到内核中的,初始化函数流程为sysfs_init()->register_filesystem()->kern_mount();在挂载sysfs中需要关注的一个函数sysfs_fill_super();42 static int sysfs_fill_super(struct super_block *sb, void *data, int silent) 43 { 44 struct inode *inode; 45 struct dentry *root; 46 47 sb->s_blocksize = PAGE_CACHE_SIZE; 48 sb->s_blocksize_bits = PAGE_CACHE_SHIFT; 49 sb->s_magic = SYSFS_MAGIC; 50 sb->s_op = &sysfs_ops; 51 sb->s_time_gran = 1; 52 sysfs_sb = sb; 53 54 /* get root inode, initialize and unlock it */ 55 inode = sysfs_get_inode(&sysfs_root); 56 if (!inode) { 57 pr_debug("sysfs: could not get root inode\n"); 58 return -ENOMEM; 59 } 60 61 /* instantiate and link root dentry */ 62 root = d_alloc_root(inode); 63 if (!root) { 64 pr_debug("%s: could not get root dentry!\n",__func__); 65 iput(inode); 66 return -ENOMEM; 67 } 68 root->d_fsdata = &sysfs_root; 69 sb->s_root = root; 70 return 0; 71 } 第55行分配sysfs根目录Inode ,第62行建立根目录dentry . 第68行是把sysfs根目录的sysfs_dirent对象(sysfs_root) 初始化给根目录dentry->d_fsdata ,这是很中要的,在后面sysfs动态建立文件时可以看到它的用处. sysfs分配inode函数流程为sysfs_get_inode()->iget_locked()->sysfs_init_inode() ,接下来需要看看sysfs是如何初始化inode的.148 static void sysfs_init_inode(struct sysfs_dirent *sd, struct inode *inode)149 {150 struct bin_attribute *bin_attr;151 152 inode->i_blocks = 0;153 inode->i_mapping->a_ops = &sysfs_aops;154 inode->i_mapping->backing_dev_info = &sysfs_backing_dev_info;155 inode->i_op = &sysfs_inode_operations;156 inode->i_ino = sd->s_ino;157 lockdep_set_class(&inode->i_mutex, &sysfs_inode_imutex_key);158 159 if (sd->s_iattr) {160 /* sysfs_dirent has non-default attributes161 * get them for the new inode from persistent copy162 * in sysfs_dirent163 */164 set_inode_attr(inode, sd->s_iattr);165 } else166 set_default_inode_attr(inode, sd->s_mode);167 168 169 /* initialize inode according to type */170 switch (sysfs_type(sd)) {171 case SYSFS_DIR:172 inode->i_op = &sysfs_dir_inode_operations;173 inode->i_fop = &sysfs_dir_operations;174 inode->i_nlink = sysfs_count_nlink(sd);175 break;176 case SYSFS_KOBJ_ATTR:177 inode->i_size = PAGE_SIZE;178 inode->i_fop = &sysfs_file_operations;179 break;180 case SYSFS_KOBJ_BIN_ATTR:181 bin_attr = sd->s_bin_attr.bin_attr;182 inode->i_size = bin_attr->size;183 inode->i_fop = &bin_fops;184 break;185 case SYSFS_KOBJ_LINK:186 inode->i_op = &sysfs_symlink_inode_operations;187 break;188 default:189 BUG();190 }191 192 unlock_new_inode(inode);193 } 第171行 case SYSFS_DIR 说明这个文件是sysfs下的目录文件, 然后初始化inode操作方法为sysfs_dir_inode_operations ,目录文件操作方法为sysfs_dir_operations, 第176行case SYSFS_KOBJ_ATTR: 说明这个文件是sysfs下的属性文件, 初始化文件操作方法为sysfs_file_operations第180行 case SYSFS_KOBJ_BIN_ATTR:该文件是一个二进制文件,初始化文件文件操作方法为bin_fops.第185行 case SYSFS_KOBJ_LINK:,文件是一个符号链接文件,初始化索引节点操作方法为sysfs_symlink_inode_operations .
阅读全文
0 0
- sysfs文件系统之初始化
- Linux文件系统之sysfs
- Linux文件系统之sysfs
- Linux文件系统之sysfs
- linux之sysfs文件系统
- Linux文件系统之sysfs
- sysfs文件系统之建立文件
- sysfs文件系统之读写文件
- Linux那些事儿之我是Sysfs(9)sysfs文件系统模型
- Linux那些事儿之我是Sysfs(9)sysfs文件系统模型
- Linux那些事儿之我是Sysfs(9)sysfs文件系统模型
- Linux那些事儿之我是Sysfs(9)sysfs文件系统模型
- sysfs 文件系统
- SYSFS文件系统
- sysfs 文件系统
- sysfs文件系统
- sysfs 文件系统
- sysfs文件系统
- reactor模式
- resteasy学习
- SKU与SPU的区别
- LeetCode 189
- Java获取客户端IP
- sysfs文件系统之初始化
- CANopen协议报文处理
- 使用Centos的yum安装java后,安装包中没有jps文件
- 如何安装IOS11系统
- Excel表格数据导入mysql数据库中
- 2017计蒜之道初赛第六场-微软手机的信号显示
- extjs4的radiogroup设值
- Ctrl+C 后能同时保存snapshot和日志的方法
- 自定义View(通过ViewGroup实现,Textview长度根据字数的多少而定的)