内核对象kobject和sysfs(2)——kref分析


在介绍ref之前,先贴上kref的结构:

struct kref {
atomic_t refcount;
};

可以看到,kref只是包含一个原子量的数而已,并没有别的成员提供自动回收的功能。实际上,kref只是记录了某个模块的引用次数,初始状态为1.当引用计数为0的时候,将调用自定义的释放函数。

下面我们介绍内核提供的kref的操作函数:

kref初始化函数kref_init:

static inline void kref_init(struct kref *kref)
{
atomic_set(&kref->refcount, 1);
}

从函数原型可以看到,实际上kref初始化的时候就被初始化为1了,kref

kref的增加引用的函数kref_get:

static inline void kref_get(struct kref *kref)
{
/* If refcount was 0 before incrementing then we have a race
* condition when this kref is freeing by some other thread right now.
* In this case one should use kref_get_unless_zero()
*/
WARN_ON_ONCE(atomic_inc_return(&kref->refcount) < 2);
}

由于初始化已经是1,所以即使是第一次增加引用,引用计数也不会小于2,如果小于了2,则说明程序出了问题,将给出一个警告。

kref的释放引用的函数:

static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref))
{
return kref_sub(kref, 1, release);
} static inline int kref_sub(struct kref *kref, unsigned int count,
void (*release)(struct kref *kref))
{
WARN_ON(release == NULL); if (atomic_sub_and_test((int) count, &kref->refcount)) {
release(kref);
return 1;
}
return 0;
}

可以看到,释放函数,有两个参数,其中一个是kref,另外一个是一个函数指针。这个函数,则是自定义的释放函数。在kref_sub函数内,当条件满足,将会调用自定义的release函数。

atomic_sub_and_test函数kref减去count,如果结果是0,则返回真,否则,返回假。

对于初学者,读到这里,其实可以停下来,去写一个自定义的内嵌kref的内核模块进行测试kref的功能。下面给出编程步骤:

  1. 自定义一个结构体,内嵌kref。注意,一定要内嵌;
  2. 初始化函数内申请资源构造自定义的结构体;
  3. 初始化kref;
  4. 在卸载函数内,释放引用函数。

在这样的简单的一个模块里,验证自定义的release函数是否会被调用,是初学者深刻理解kref的必经之路。

但是,这里我想提出一个问题。前面说过,kref是为了自动回收资源来用的,但是上面的例子里,明显回收资源还是需要自己调用kref_put,这不是反而变得麻烦了么?

实际,在实际的驱动中,kref_get可能会出现在各种地方。其实,我们可以注意到,如果不使用kref机制,那么在卸载函数里,我们需要强制回收资源。但是如果使用了kref的功能,那么实际上,在卸载函数里,并不一定真正回收资源。因为此时kref的引用不一定为0.这在热插拔中的应用非常普遍。

内核对象kobject和sysfs(2)——kref分析的更多相关文章

  1. 内核对象kobject和sysfs(3)——kobj分析

    内核对象kobject和sysfs(3)--kobj分析 在分析kobj之前,先总结下kobj的功能: 实现结构的动态管理: 实现内核对象到sysfs的映射: 实现自定义属性的管理. 关注一下kobj ...

  2. 内核对象kobject和sysfs(4)——kset分析

    内核对象kobject和sysfs(4)--kset分析 从狭义上来说,kset就是kobj的一个再封装而已.在封装之后,提供了针对kset之下所有kobj统一管理的一些方法. 我们还是从结构说起: ...

  3. 内核对象kobject和sysfs(1)——概述

    内核对象kobject和sysfs(1)--概述 问题: 在走读驱动代码时,经常看见kref,kobj,sysfs这些结构,这些结构到底有什么作用?如何理解并使用这些结构呢?这将在接下来的这一系列文章 ...

  4. sysfs - 用于导出内核对象(kobject)的文件系统

    sysfs - _The_ filesystem for exporting kernel objects.sysfs - 用于导出内核对象(kobject)的文件系统Patrick Mochel & ...

  5. [4]Windows内核情景分析---内核对象

    写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...

  6. Linux 内核文档翻译 - kobject.txt

    原文地址:Linux 内核文档翻译 - kobject.txt 作者:qh997 Everything you never wanted to know about kobjects, ksets, ...

  7. Linux内核文档翻译——kobject.txt

    ==================================================================== Everything you never wanted to ...

  8. 第9章 用内核对象进行线程同步(4)_死锁(DeadLock)及其他

    9.7 线程同步对象速查表 对象 何时处于未触发状态 何时处于触发状态 成功等待的副作用 进程 进程仍在运行的时候 进程终止的时(ExitProcess.TerminateProcess) 没有 线程 ...

  9. 第9章 用内核对象进行线程同步(1)_事件对象(Event)

    9.1 等待函数 (1)WaitForSingleObject(hObject,dwMilliseonds); ①dwMilliseconds为INFINITE时表示无限等待 ②dwMilliseco ...

随机推荐

  1. 基于Spring的最简单的定时任务实现与配置(一)

    朋友的项目中有点问题.他那边是Spring架构的,有一个比较简单的需要定时的任务执行.在了解了他的需求之后,于是提出了比较简单的Spring+quartz的实现方式. 注意本文只是讨论,在已搭建完毕的 ...

  2. JS获取浏览器类型和版本号

    JS获取浏览器类型和版本号,增加了IE11的判断. 2015/7/5更新: 简化代码逻辑 var zbrowser = {} var ua = navigator.userAgent.toLowerC ...

  3. Linux上网问题

    开发板运行linux下和主机Windows互ping这块,就是Windows这边已经显示本地连接上了,从Windows ping Linux 可以通 但是在CRT 上ping Windows就没反应了 ...

  4. js 、jq强化复习

    JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据: 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML ...

  5. AngularJs + angular-ui-router + bootstrap 实现blog基础导航功能

    AngularJs + angular-ui-router + bootstrap 实现blog基础导航功能 核心代码如下 1.index.html <!DOCTYPE html> < ...

  6. 我的第一篇博文:C++最初的路-经典的小游戏走迷宫

    写在开始:这个博客建于大二下学期.2年多的学习,从网上借鉴的大牛经验,代码,指导数不胜数,而其中大部分来自别人的博客,于是期待有一天也能把自己在学习过程中的一些经验拿出来与大家分享. 其实我凝望了C+ ...

  7. 使用hexdump追踪FAT32文件系统中的一个文件

    最近在看文件系统基础结构等知识,本来重点是想看EXT4文件系统,但是目前没有找到比较详细说明EXT4文件系统详细结构的,用EXT3的对应着找结果有点出入,在想是不是我用hexdump的参数有问题,于是 ...

  8. ORA-01157,记一次Oracle故障恢复过程

    生产环境中有两台部署PowerCenter的ETL业务机,近期发现无法通过客户端连接到ETL服务. 初步怀疑是PowerCenter挂掉了,或者资料库出现了故障. 登陆设备后发现PowerCenter ...

  9. Java自学手记——servlet3.0新特性

    servlet3.0出来已经很久了,但市场上尚未普遍应用,servlet3.0有三个比较重要的新特性:使用注解来代替配置文件,异步处理以及上传组件支持. 支持servlet3.0的要求:MyEclip ...

  10. HTML 头标签的 <title> <base> <meta> <link> <script> 的内容意思

    头标签都放在<head></head>头部分之间.包括:title base meta link <title>:指定浏览器的.(标题) <base>: ...