栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux设备模型(4)详解kobject创建和注销流程

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux设备模型(4)详解kobject创建和注销流程

文章目录

前言创建kobject流程分析

创建与初始化添加到sysfs 注销kobject流程

前言

在上一篇文章中我们做了创建和注销kobject的实验,这篇文章以kobject_create_and_add()和kobject_put(k_object);为出发点详细分析一个kobject创建和注销过程中做了哪些工作。

创建kobject流程分析

函数调用关系:

根据上面的函数调用关系,我们来分析下kobject_create_and_add具体做了哪些工作。该函数主要完成两个功能:

kobject_create:创建并初始化一个kobject结构体;kobject_add:将kobject添加到sysfs结构中,并在/sys/…/下创建目录。 创建与初始化

    kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
    使用kzmalloc申请一个结构体内存;kref_init(&kobj->kref);
    将该kobject的引用计数设置为1。INIT_LIST_HEAD(&kobj->entry);
    初始化链表节点,用于将该kobject加入一个kset链表。kobj->ktype = ktype;
    初始化基本的kobject方法,主要包括动态释放函数dynamic_kobj_release用于引用计数为0时自动释放kobj;kobj_attr_show调用kobj的show函数,在用户态执行cat时调用;kobj_attr_store调用kobj的store函数,在用户态写入时调用。
添加到sysfs
    kobject_set_name_vargs(kobj, fmt, vargs);
    根据传入的参数设置kobject的name,也对应/sys下看到的文件夹名。kobj->parent = parent;
    根据传入的参数设置父指针。create_dir(kobj);
    创建/sys下对应的路径,这里创建路径主要涉及sysfs的知识,这里不展开,后续文章会专门分析sysfs。
注销kobject流程

在这里注销一个kobject使用的是kobject_put(),就是讲kobj的引用计数减1,前面分析创建流程时提到kobj初始化时会将引用计数设置为1,这里调用kobject_put后会将kobj的引用计数变为0,并且同时调用kobject_release()。因此我们主要分析kobject_release做了哪些事情。
主要函数调用关系如下;

    sysfs_remove_dir(kobj);
    删除/sys下的设备节点kobj_kset_leave(kobj);
    将该kobj从所属的kset链表中删除。t->release(kobj);
    调用kobj的release方法,默认为dynamic_kobj_release(),释放kobj的结构体内存,release方法可被重写。kfree_const(name);
    释放kobj name申请的内存。kobject_put(parent);
    将kobj的父kobj引用计数减1。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/725251.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号