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

如何在Linux内核驱动中通过设备名获取其他设备的struct device*?

通过设备名称获取struct device*的内核API方案

如果无法通过设备树访问目标设备,且仅知晓设备名称,你可以采用以下两种通用方法实现需求:

方法1:使用bus_find_device()全局查找

该函数可遍历指定总线的所有设备,通过自定义匹配函数筛选目标设备。若不清楚目标设备所属总线,传入NULL会遍历系统内所有总线的设备。

示例代码:

#include <linux/device.h>

static int match_dev_name(struct device *dev, void *data)
{
    const char *target_name = data;
    return strcmp(dev_name(dev), target_name) == 0;
}

struct device *get_dev_by_name(const char *name)
{
    struct device *dev;

    dev = bus_find_device(NULL, NULL, (void *)name, match_dev_name);
    if (dev) {
        /* 必须增加引用计数,避免设备被内核提前释放 */
        get_device(dev);
    }
    return dev;
}

使用完获取到的struct device*后,务必调用put_device(dev)释放引用计数。

方法2:针对特定总线的定向查找(已知总线类型时优先使用)

若明确目标设备所属总线(比如platform总线),使用对应总线的专用查找函数效率更高:

  • 针对platform设备:使用platform_device_find()获取struct platform_device*,其dev成员即为目标struct device*
    #include <linux/platform_device.h>
    
    struct device *get_platform_dev_by_name(const char *name)
    {
        struct platform_device *pdev = platform_device_find(name, NULL);
        if (pdev) {
            get_device(&pdev->dev);
            return &pdev->dev;
        }
        return NULL;
    }
    
  • 针对字符设备类:可使用class_find_device(),需先通过class_get()获取对应设备类指针

关键说明

  • 全局遍历设备链表效率较低,若有额外信息(比如总线类型、设备类),优先使用针对性查找函数
  • 必须严格管理设备引用计数:get_device()增加引用,put_device()减少引用,防止设备在使用过程中被内核释放
  • driver_find_device_by_name()仅查找与指定驱动绑定的设备,因你缺少目标设备对应的struct device_driver*,该函数不适用当前场景

内容的提问来源于stack exchange,提问作者JohnnyFromBF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:20:44