活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
sysfs文件系统于Linux2.6版本引入。它被看成是与proc,devfs和devpty同类别的文件系统。
sysfs允许内核以挂载在内存上的方式导出一个文件系统,即sysfs文件系统,该文件系统的目录排列具有层次性,其基本核心数据结构是kobject。sysfs的层次结构表现了内核对象,属性及它们之间的相互关系,可以方便用户交互使用。
sysfs也可以像其他基于内存的文件系统一样从用户空间挂载:
mount -t sysfs sysfs /sys
既然是基于内存的文件系统挂载也同理其他挂载,都可以在用户空间使用mount能够看到挂着信息,如下:

sys文件系统在kernel启动各子系统核心数据kobject注册时候产生,通过上面的mount信息也可以看到sysfs挂载的目录是固定的在/sys下,最终层次展示如下:

sysfs的内核代码实现位于kernel/fs/sysfs/,该功能由宏CONFIG_SYSFS控制,默认参与编译。

通过sysfs的Makefile可以看到sysfs的核心实现由五个关键文件组成。

前面提到sysfs在kernel初始化时候各个子系统初始化注册核心kobject开始形成,这里以bus子系统为例,sysfs文件系统注册流程分析:
1.kernel启动后调用buses_init函数创建/sys/bus文件目录;
2.通过总线注册函数bus_register进行总线注册,总线注册完成后在总线目录下生成devices和drivers文件夹;
3.通过device_register和driver_regitster函数注册对于的设备和驱动;

kernel/drivers/base/init.c
/**
* driver_init - initialize driver model.
*
* Call the driver model init functions to initialize their
* subsystems. Called early from init/main.c.
*/
void __init driver_init(void)
{
/* These are the core pieces */
devtmpfs_init();
devices_init();
buses_init();
classes_init();
firmware_init();
hypervisor_init();
/* These are also core pieces, but must come after the
* core core pieces.
*/
platform_bus_init();
cpu_dev_init();
memory_dev_init();
container_dev_init();
of_core_init();
}
kernel/drivers/base/bus.c
int __init buses_init(void)
{
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
if (!bus_kset)
return -ENOMEM;
system_kset = kset_create_and_add("system", NULL, &devices_kset->kobj);
if (!system_kset)
return -ENOMEM;
return 0;
}