作者简介:刘立超,靠 Linux 内核,驱动吃饭的工程师,喜欢探究事物本质,喜欢分享。
版权声明:本文最先发表于 “泰晓科技” 微信公众号,欢迎转载,转载时请在文章的开头保留本声明。
1. sysfs 文件系统简介
sysfs 是一个内存文件系统,可以将内核数据暴露给用户态。因为它比较简单,且与设备模型有紧密联系。同时,不涉及 pagecache,IO 调度,块设备等概念,是初学 VFS 概念的绝佳目标。
本篇文章介绍:文件读写在内核中的基本流程
inode/dentry 的概念
设备模型在 kobject/ktype/kset 概念
2. sysfs 目录/文件创建//创建目录int sysfs_create_dir(struct kobject * kobj)
Linux 的设备模型中,每一个 kobject 对应 sysfs 文件系统的一个目录,所以入参 kobject 表示创建一个名称为 kobj->name 的目录。其父目录是 kobj->parent,如果 parent 不存在,就在根目录创建。
每一个 sysfs 文件系统内的目录或文件,都对应一个 sysfs_dirent。
所以,创建目录的步骤如下:分配 sysfs_dirent,设置此 sysfs_dirent 类型是 SYSFS_DIR,表示它是一个目录
调用 sysfs_add_one,根据 dirent 的 hash 值,把 sysfs_dirent 添加到 sd->s_parent->s_dir.children.rb_node(红黑树),即添加到父目录的 children 红黑树中
创建文件的 API 是 sysfs_create_file,与 sysfs_create_dir 类似,就是 sysfs_dirent 类型是 SYSFS_KOBJ_ATTR,表示此 sysfs_dire