当引用计数器的值变为 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 时执行必要的资源清理和释放操作, 以确保系统的正确运行和资源管理。
