命令字:!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
最后编辑:郭建程 更新时间:2025-11-07 11:33