You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:32:35