Linux configfs机制

本文详细介绍了Linux内核中的configfs机制,主要用于在内核启动后动态修改或增加设备树(DTS)内容,以适应如Intel SOC中FPGA模块的需求。configfs是一个基于内存的文件系统,允许用户空间配置内核对象。文章通过分析内核源码及数据结构,展示了configfs如何用于创建子系统、组和项,并详细解释了mkdir、write等操作在configfs中的实现。通过对configfs的理解,开发者可以实现动态加载设备驱动的功能。
摘要由CSDN通过智能技术生成

     1、在使用intel SOC过程中,驱动的DTS需要在内核启动以后把FPGA core load以后加载PL侧设备的DTS,此时使用的是Linux的dts的overlay机制,该机制本质是使用Linux的configfs 机制,在此分析。

   2、   Linux内核驱动中使用的设备树作为驱动match的方法,在内核初始化时候会对dts解析,然后生成一个个的device node,根据node 中的compatile 与driver中的相应的属性对比,如果一致就会执行driver 中的probe函数。一般来说dts 构造出的东西是不需要改变的,在kernel 初始化之前就已经确定完成了,但是有些SOC集成了FPGA模块,如果FPGA的firmware有修改,或者说该SOC的FPGA的fireware必须得在Linux kernal setup 完成以后加载,而我们的驱动中的好多模块都是基于FPGA的,这样内核中的dts就得需要做相应的修改,这样就出现了overlay机制。 该机制就是在kernel 启动以后系统加载时候修改或者增加部分dtsi,最终把整个系统需要的设备驱动全部加载进去。(忘记从谁的博客抄的了)

   3、  Linux内核中对configfs的介绍和实例都在 documentation/filesystems/configfs/configfs.txt。网上对configfs的介绍基本都是对该文件的翻译,比较详细的refer:https://blog.csdn.net/u014135607/article/details/79949571

    4、这款soc手册中给出的加载实例:

         mkdir /sys/kernel/config/device-tree/overlays/0

        # echo socfpga_stratix10_ovl1.dtb >/sys/kernel/config/device-tree/overlays/0/path

       Refer :https://www.intel.com/content/www/us/en/programmable/documentation/kqx1502122862454.html

5、configfs是什么?

    configfs - Userspace-driven kernel object configuration.直接翻译过来就是用户空间配置内核对象,在configfs.txt中可以看到其中的描述:configfs是一个基于ram的文件系统,通过对该文件系统的操作实现对内核对象的配置。

6、数据结构分析

      根据configfs.txt的说明我们可以抽象的理解configfs的文件主要分成三层:1、configfs_subsystem (子系统)  2、configfs_grounp(组层) 3、config_item. 我们在使用时候一般会创建一个config_subsystem,再在这个子系统下边创建config_group,在config_group创建config_item,然后具体的操作都是config_item相关的,config_item中的接口的具体实现就是文件的具体操作,我们在不去了解具体实现的情况下猜测的操作可能有:创建(mkdir)、删除(rm )、读(read)、写(write)等操作。具体的实际例子可以看configfs.txt。

7、 根据这个分析可以确定我们在设备树重新加载时候肯定是调用了mkdir 接口创建了overlay 和patch ,也调用了write 把.dtbo文件写进去。

8 、code分析(drivers/of/configfs.c

static int __init of_cfs_init(void)
{
    int ret;
    pr_info("%s\n", __func__);
    
    //新创建一个子系统
    config_group_init(&of_cfs_subsys.su_group); 
    //新建一个目录 目录名字是overlays 对应的操作是overlays_type
    config_group_init_type_name(&of_cfs_overlay_group, "overlays",
            &overlays_type);
    //将目录 放到这
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值