03、kobject 释放实例
当引用计数器的值变为 0后, 会自动调用自定义的释放函数去执行释放的操作 。
一、kobject_put如何释放的
kobject_put()函数的作用很简单:它负责管理kobject对象的使用计数。具体流程是这样的:
当调用kobject_put()时,系统会先减少该对象的计数器值。如果计数器降为0,说明没有其他地方再使用这个对象了,这时系统会自动执行预设的清理操作。这个清理操作就是通过调用预先绑定的release函数来完成的,它会负责释放对象占用的资源(比如内存、设备关联等)。
整个过程可以理解为:每次调用kobject_put()就像说"我不用了",当所有使用者都说了这句话后,系统就会彻底清理这个对象。
Linux 系统帮我们实现好了释放函数, 如下图所示:
在上图的 release 函数中, 该函数最终会去调用 kobject_cleanup 函数, kobject_cleanup 函数实现如下图所示:
这个函数的设计说明了:
kobject的清理完全依赖于kobj_type结构体中定义的释放函数
使用kobject_init_and_add()时必须提供kobj_type结构体,否则:
- 系统无法找到释放函数
- 会导致资源无法正确释放
内核会自动处理事件通知和sysfs清理,但对象本身的资源释放必须由用户自己实现
整个过程就像在说:"我们先检查对象的各种状态,自动处理系统层面的清理,然后调用你之前定义好的清理函数,最后处理剩下的内存回收工作"。
二、dynamic_kobj_ktype
总结起来, kobj_type 结构体中的释放函数是为了确保在释放 kobject 时执行必要的资源清理和释放操作, 以确保系统的正确运行和资源管理。