Linux 内核释放函数和 kobject 类型
讨论中仍然缺失的一个重要事情是当一个 kobject 的引用计数到 0 时会发生什么. 创建 kobject 的代码通常不知道什么时候要发生这个情况; 如果它知道, 在第一位使用一个引 用计数就没有意义了. 即便当引入 sysfs 时可预测的对象生命周期变得更加复杂; 用户 空间程序可保持一个对 kobject 的引用( 通过保持一个它的关联的 sysfs 文件打开 )一 段任意的时间.
最后的结果是一个被 kobject 保护的结构无法在任何一个单个的, 可预测的驱动生命周 期中的点被释放, 但是可以在必须准备在 kobject 的引用计数到 0 的任何时刻运行的代 码中. 引用计数不在创建 kobject 的代码的直接控制之下. 因此这个代码必须被异步通 知, 无论何时对它的 kobject 的最后引用消失.
这个通知由 kobject 的一个释放函数来完成. 常常地, 这个方法有一个形式如下:
void my_object_release(struct kobject *kobj)
{
struct my_object *mine = container_of(kobj, struct my_object, kobj);
/* Perform any additional cleanup on this object, then... */ kfree(mine);
}
要强调的重要一点是: 每个 kobject 必须有一个释放函数, 并且这个 kobject 必须持续 ( 以一致的状态 ) 直到这个方法被调用. 如果这些限制不满足, 代码就有缺陷. 当这个 对象还在使用时被释放会有风险, 或者在最后引用被返回后无法释放对象.
有趣的是, 释放方法没有存储在 kobject 自身里面; 相反, 它被关联到包含 kobject 的 结构类型中. 这个类型被跟踪, 用一个 struct kobj_type 结构类型, 常常简单地称为一 个 "ktype". 这个结构看来如下:
struct
kobj_type {
void
(*release)(struct kobject *); struct sysfs_ops *sysfs_ops; struct attribute **default_attrs;
};
在
struct kobj_type 中的 release 成员是, 当然, 一个指向这个 kobject 类型的 release 方法的指针. 我们将回到其他
2 个成员( sysfs_ops 和 default_attrs )在本 章后面.
每一个
kobject 需要有一个关联的 kobj_type 结构. 易混淆地, 指向这个结构的指针能 在 2 个不同的地方找到. kobject 结构自身包含一个成员(称为
ktype)包含这个指针. 但是, 如果这个 kobject 是一个 kset 的成员, kobj_type 指针由 kset 提供. ( 我们 将在下一节查看 ksets. ) 其间, 这个宏定义:
struct kobj_type *get_ktype(struct kobject *kobj);
finds the kobj_type pointer for a given kobject.
Linux 内核释放函数和 kobject 类型的更多相关文章
- Linux内核d_path函数应用的经验总结
问题背景 一个内核模块中,需要通过d_path接口获取文件的路径,然后与目标文件白名单做匹配. 在生产环境中,获取的文件是存在的,但是与文件白名单中的文件总是匹配失败. 问题定位: 通过打印d_pat ...
- linux内核常用函数或宏
1. simple_strtoul 用于将字符串转换为无符号长整数,第3个参数10意味着转换方式是10进制. ival = simple_strtoul(buffer, NULL, 10); 2. 大 ...
- linux内核--wait_event_interruptible_timeout()函数分析(转)
原文:https://blog.csdn.net/wuyongpeng0912/article/details/45723657 网上有关于此函数的分析,但大都是同一篇文章转载来转载去,没有进一步的分 ...
- 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...
- Linux内核调试方法总结
Linux内核调试方法总结 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- 基于tiny4412的Linux内核移植 -- 设备树的展开【转】
转自:https://www.cnblogs.com/pengdonglin137/p/5248114.html#_lab2_3_1 阅读目录(Content) 作者信息 平台简介 摘要 正文 一.根 ...
- Linux内核调试方法【转】
转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...
- 常见linux内核线程说明
ps进程名有方括号的是内核级的进程,执行辅助功能(比如将缓存写入到磁盘):所有其他进程都是使用者进程.您会注意到,就算是在您新安装的(最小化的)系统中,也会有很多进程在运行. 在文档kernel-pe ...
随机推荐
- NLP+2vec︱认识多种多样的2vec向量化模型
1.word2vec 耳熟能详的NLP向量化模型. Paper: https://papers.nips.cc/paper/5021-distributed-representations-of-wo ...
- SqlAlchemy的简单使用
1.SQLAlchemy SQLAlchemy是python的一个通用的ORM框架 1.1 创建数据表 from sqlalchemy.ext.declarative import declarati ...
- spring-data-jpa实体类继承抽象类如何映射父类的属性到数据库
在抽象父类上加上注解@MappedSuperclass @MappedSuperclass public class Pet { private Integer id;//id private Str ...
- Ubuntu 如何编译安装第三方库
在工程应用中都会用到第三方库,标准库是在我们安装IDE环境或系统自带已经编译好的库,我们是可以直接调用的,而第三方库需要我们自己下载,编译和安装后才能使用,这里我们说的是Ubuntu如何使用cmake ...
- Android实现圆角边框
http://www.cnblogs.com/flyme/archive/2012/06/20/2556259.html android shape的使用 http://www.cnblogs.com ...
- WPF动画应用-几何图形扩散动画
原文:WPF动画应用-几何图形扩散动画 最终效果图: 本实例中用到了DoubleAnimation和Storyboard两个类. 如果想系统学习的话可以直接点击链接看官方文档. 源码: 首先,在页面上 ...
- @codeforces - 1214H@ Tiles Placement
目录 @description@ @solution@ @part - 1@ @part - 2@ @accepted code@ @details@ @description@ 给定一个 n 点的树 ...
- python 自动登录网页
语言:python 浏览器:chrome 工具:chrome控制台 #!/usr/bin/python # coding: GBK import urllib,urllib2,httplib,cook ...
- Xcode4.2 本地化 总结
1 xcode4.2,如果是简体中文,把国际化的文件放到zh-Hans.lproj中就显示正常了.如果放到zh.lproj中就不可以 2 字符串 1)在项目的"supporting file ...
- L05 Laravel 教程 - 电商实战
https://laravel-china.org/courses/laravel-shop https://laravel-china.org/topics/13206/laravel-shop-c ...