• 【打卡】【sysfs相关API详解】21天学习挑战赛—RK3399平台开发入门到精通-Day19



    活动地址:CSDN21天学习挑战赛

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
    想系统/深入学习某技术知识点…
    一个人摸索学习很难坚持,想组团高效学习…
    想写博客但无从下手,急需写作干货注入能量…
    热爱写作,愿意让自己成为更好的人…

    sysfs文件系统于Linux2.6版本引入。它被看成是与proc,devfs和devpty同类别的文件系统。
    sysfs允许内核以挂载在内存上的方式导出一个文件系统,即sysfs文件系统,该文件系统的目录排列具有层次性,其基本核心数据结构是kobject。sysfs的层次结构表现了内核对象,属性及它们之间的相互关系,可以方便用户交互使用。

    sysfs也可以像其他基于内存的文件系统一样从用户空间挂载:

    mount -t sysfs sysfs /sys
    
    • 1

    既然是基于内存的文件系统挂载也同理其他挂载,都可以在用户空间使用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();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    路径分析—PostgreSQL+GeoServer+Openlayers(二)
    详解AQS中的condition源码原理
    参数传递的方式
    编写Spring项目中可能报的错误
    解决注册Kaggle出现的“Captcha must be filled out”问题
    数字化转型中的“数字化”
    科技巨头联想入局造车_爱普搜汽车
    HTML+CSS+JS鲜花商城网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计
    C Primer Plus(6) 中文版 第9章 函数 9.1 复习函数
    Python:灵活的开发环境
  • 原文地址:https://blog.csdn.net/qq_23327993/article/details/126450148