命令字:!ndx.sysdevices

用法描述

用于 查询系统设备列表,设备名、内存地址定位目标设备
适用于内核设备模型排查、驱动绑定验证、设备资源分析等场景。
支持的命令行参数:
-h / –help / ? 显示命令帮助文档(含参数说明、示例)

开发过程

1. 关键全局变量

关键全局变量 作用
devices_kset 统一管理系统中所有已注册的设备对象

devices_int中创建了devices_kset

使用dt命令查看,确保存在这个kset

2. 相关内核实现和数据结构

device_initialize初始化设备结构体(struct device)的核心成员
device_add将设备添加到系统中

device_initialize指定了对象的所属集合

kobject_add(&dev->kobj, dev->kobj.parent, NULL)

  • 第一个参数 &dev->kobj:指向要添加到内核对象系统中的 kobject 结构体实例,也就是要注册的内核对象。
  • 第二个参数 dev->kobj.parent:指定了该 kobject 的父对象 。通过指定父对象,就能够构建起内核对象之间的层次关系,形成树形结构。例如,一个具体设备的 kobject 可能是某个设备类 kobject 的子对象。在 sysfs 文件系统中,这种层次关系会体现为目录的嵌套关系,父 kobject 对应上层目录,子 kobject 对应下层目录。
  • 第三个参数 NULL:这是可变参数部分,一般用于指定新创建的 kobject 在 sysfs 中对应的目录名。当传入 NULL 时,内核会根据该 kobject 所属的对象的相关属性来确定默认的目录名

    kset 简介
    set 是 Linux 内核设备模型中用于组织和管理 kobject 的集合型数据结构,它用于将内核中相关的 kobject (如同一类设备的对象)归类整合,提供批量管理、统一操作的能力。同时,kset 通过内嵌的 kobject 与 sysfs 文件系统形成关联,在 sysfs 中表现为一个目录,其下包含该集合内所有 kobject 对应的子目录,从而在用户空间呈现出有组织的层级结构,便于对一组相关对象进行整体访问和管理。
    struct kset {
      struct list_head list;          // 链表头:串联子kobject,支持批量遍历
      spinlock_t list_lock;
      struct kobject kobj;            // 内嵌kobj:实现sysfs映射与层级管理
      const struct kset_uevent_ops *uevent_ops;
    } __randomize_layout;

kobject 简介
kobject 是 Linux 内核对象系统的基础数据结构,它用于描述内核中的各种对象(如设备、驱动等),并且为这些对象提供了引用计数、对象层次关系管理等功能。同时,kobject 与 sysfs 文件系统紧密关联,sysfs 是一个基于内存的虚拟文件系统,它将内核中的各种对象以文件和目录的形式展现出来,方便用户空间进行访问和操作。

struct kobject {
    const char      *name;          // 名称:标识kobject(如对应sysfs目录名)
    struct list_head entry;         // 链表项:接入父kset的list链表,实现层级串联
    struct kobject  *parent;        // 父kobj:指定上层kobject,构成sysfs目录层级
    struct kset     *kset;          // 所属kset:关联到管理它的kset
    const struct kobj_type *ktype;  
    struct kernfs_node *sd;        
    struct kref     kref;           // 引用计数:管理kobject生命周期,防止提前释放
    // 以下为状态位(1bit):
    unsigned int state_initialized:1;   
    unsigned int state_in_sysfs:1;       
    unsigned int state_add_uevent_sent:1;
    unsigned int state_remove_uevent_sent:1;
    unsigned int uevent_suppress:1;      
};

device

dt lk!device
   +0x000 kobj             : kobject
   +0x040 parent           : Ptr64 device
   +0x048 p                : Ptr64 device_private
   +0x050 init_name        : Ptr64 Char
   +0x058 type             : Ptr64 device_type
   +0x060 bus              : Ptr64 bus_type
   +0x068 driver           : Ptr64 device_driver
   +0x070 platform_data    : Ptr64 Void
   +0x078 driver_data      : Ptr64 Void
   +0x080 mutex            : mutex
   +0x0b8 links            : dev_links_info
   +0x0f0 power            : dev_pm_info
   +0x260 pm_domain        : Ptr64 dev_pm_domain
   +0x268 em_pd            : Ptr64 em_perf_domain
   +0x270 pins             : Ptr64 dev_pin_info
   +0x278 msi              : dev_msi_info
   +0x288 dma_ops          : Ptr64 dma_map_ops
   +0x290 dma_mask         : Ptr64 Uint8B
   +0x298 coherent_dma_mask : Uint8B
   +0x2a0 bus_dma_limit    : Uint8B
   +0x2a8 dma_range_map    : Ptr64 bus_dma_region
   +0x2b0 dma_parms        : Ptr64 device_dma_parameters
   +0x2b8 dma_pools        : list_head
   +0x2c8 dma_mem          : Ptr64 dma_coherent_mem
   +0x2d0 cma_area         : Ptr64 cma
   +0x2d8 dma_io_tlb_mem   : Ptr64 io_tlb_mem
   +0x2e0 archdata         : dev_archdata
   +0x2e0 of_node          : Ptr64 device_node
   +0x2e8 fwnode           : Ptr64 fwnode_handle
   +0x2f0 devt             : Uint4B
   +0x2f4 id               : Uint4B
   +0x2f8 devres_lock      : spinlock
   +0x310 devres_head      : list_head
   +0x320 class            : Ptr64 class
   +0x328 groups           : Ptr64 Ptr64 attribute_group
   +0x330 release          : Ptr64    
   +0x338 iommu_group      : Ptr64 iommu_group
   +0x340 iommu            : Ptr64 dev_iommu
   +0x348 physical_location : Ptr64 device_physical_location
   +0x350 removable        : device_removable
   +0x354 offline_disabled : Pos 6816, 1 Bit
   +0x354 offline          : Pos 6817, 1 Bit
   +0x354 of_node_reused   : Pos 6818, 1 Bit
   +0x354 state_synced     : Pos 6819, 1 Bit
   +0x354 can_match        : Pos 6820, 1 Bit
   +0x354 dma_coherent     : Pos 6821, 1 Bit

3. 实例测试

!ndx.sysdevices

作者:郭建程  创建时间:2025-09-29 15:45
最后编辑:郭建程  更新时间:2025-11-07 11:33