如何遍历Linux内核中已注册的struct class类并查询指定名称类?
遍历Linux内核已注册struct class并查找指定名称类的方法
直接查找指定名称的struct class(推荐)
Linux内核维护着所有已注册struct class的全局链表,稳妥的方式是参考内核原生实现的查找逻辑,直接通过名称匹配获取目标指针,避免手动遍历的潜在并发问题:
#include <linux/device.h> #include <linux/string.h> #include <linux/module.h> struct class *get_class_by_name(const char *target_name) { struct class *cls = NULL; // 保护全局class链表的互斥锁,必须持有才能安全遍历 mutex_lock(&class_mutex); list_for_each_entry(cls, &class_list, node) { if (!strcmp(cls->name, target_name)) { // 增加模块引用计数,防止class所属模块被卸载 if (!try_module_get(cls->owner)) { cls = NULL; } break; } } mutex_unlock(&class_mutex); return cls; }
遍历所有已注册的struct class
如果需要枚举全部已注册的类,可基于上述遍历逻辑扩展:
#include <linux/device.h> #include <linux/module.h> void iterate_all_classes(void) { struct class *cls; mutex_lock(&class_mutex); list_for_each_entry(cls, &class_list, node) { pr_debug("Registered class: %s\n", cls->name); // 在此添加自定义处理逻辑 } mutex_unlock(&class_mutex); }
关键注意事项
class_list是内核全局链表,所有struct class实例注册后都会加入此链表;class_mutex是保护该链表的互斥锁,必须在操作链表前后加锁/解锁,避免并发访问导致的竞态- 找到目标class后,必须调用
try_module_get获取其所属模块的引用计数,防止模块被卸载后出现悬空指针 - 不同内核版本中,
class_list和class_mutex的可见性可能不同(部分版本为静态符号),需结合目标内核的drivers/base/class.c源码确认符号是否可访问 - 使用完
struct class指针后,记得调用class_put释放引用计数,避免内存泄漏
内容的提问来源于stack exchange,提问作者rkshthrmsh
相关产品推荐
相关产品推荐

