首页 > 其他分享 >设备基本结构 【ChatGPT】

设备基本结构 【ChatGPT】

时间:2023-12-10 13:12:10浏览次数:38  
标签:属性 struct dev attr device ChatGPT 设备 结构

设备基本结构

请参阅内核文档以了解 struct device 的结构。

编程接口

发现设备的总线驱动程序使用以下方法将设备注册到核心:

int device_register(struct device *dev);

总线应该初始化以下字段:

  • parent
  • name
  • bus_id
  • bus

当设备的引用计数降至 0 时,设备将从核心中移除。可以使用以下方法调整引用计数:

struct device *get_device(struct device *dev);
void put_device(struct device *dev);

如果引用计数尚未为 0(即设备正在被移除的过程中),get_device() 将返回传递给它的 struct device 指针。

驱动程序可以使用以下方法访问设备结构中的锁:

void lock_device(struct device *dev);
void unlock_device(struct device *dev);

属性

struct device_attribute {
    struct attribute attr;
    ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);
    ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
};

设备的属性可以通过设备驱动程序通过 sysfs 导出。

有关 sysfs 工作原理的更多信息,请参阅 sysfs - The filesystem 以导出内核对象。

如《Everything you never wanted to know about kobjects, ksets, and ktypes》中所述,必须在生成 KOBJ_ADD uevent 之前创建设备属性。唯一的实现方式是定义一个属性组。

属性使用名为 DEVICE_ATTR 的宏声明:

#define DEVICE_ATTR(name, mode, show, store)

示例:

static DEVICE_ATTR(type, 0444, type_show, NULL);
static DEVICE_ATTR(power, 0644, power_show, power_store);

对于常见的 mode 值,有可用的辅助宏,因此上述示例可以简化为:

static DEVICE_ATTR_RO(type);
static DEVICE_ATTR_RW(power);

这声明了两个 struct device_attribute 类型的结构,分别命名为 'dev_attr_type' 和 'dev_attr_power'。这两个属性可以组织如下成为一个组:

static struct attribute *dev_attrs[] = {
    &dev_attr_type.attr,
    &dev_attr_power.attr,
    NULL,
};

static struct attribute_group dev_group = {
    .attrs = dev_attrs,
};

static const struct attribute_group *dev_groups[] = {
    &dev_group,
    NULL,
};

对于单个组的常见情况,有一个可用的辅助宏,因此上述两个结构可以使用以下方式声明:

ATTRIBUTE_GROUPS(dev);

然后,可以通过在调用 device_register() 之前设置 struct device 中的组指针来将这些组关联到设备:

dev->groups = dev_groups;
device_register(dev);

device_register() 函数将使用 'groups' 指针创建设备属性,而 device_unregister() 函数将使用此指针移除设备属性。

警告:虽然内核允许在任何时候对设备调用 device_create_file()device_remove_file(),但用户空间对属性创建时间有严格的期望。当在内核中注册新设备时,将生成一个 uevent 以通知用户空间(如 udev)有新设备可用。如果在设备注册后添加属性,则用户空间将不会收到通知,也不会知道新属性。

这对于需要在驱动程序探测时为设备发布附加属性的设备驱动程序非常重要。如果设备驱动程序简单地在传递给它的设备结构上调用 device_create_file(),则用户空间将永远不会收到新属性的通知。

标签:属性,struct,dev,attr,device,ChatGPT,设备,结构
From: https://www.cnblogs.com/pengdonglin137/p/17892429.html

相关文章

  • Devres - 管理设备资源 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/devres.htmlDevres-管理设备资源[email protected]首稿日期:2007年1月10日1.简介在尝试将libata转换为使用iomap时,出现了devres。每个iomapped地址应该在驱动程序分离时保留和取消映射。例如,一个普......
  • 驱动绑定 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/binding.html驱动绑定驱动绑定是将设备与能够控制它的设备驱动程序关联起来的过程。通常由总线驱动程序处理这一过程,因为总线特定的结构用于表示设备和驱动程序。使用通用设备和设备驱动程序结构后,大部分绑定可......
  • 硬件自旋锁框架 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/hwspinlock.html硬件自旋锁框架简介硬件自旋锁模块为异构处理器和不在单一共享操作系统下运行的处理器之间的同步和互斥提供硬件辅助。例如,OMAP4具有双核Cortex-A9、双核Cortex-M3和一个C64x+DSP,每个处理器运行不同的操作系......
  • 驱动模型 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/index.htmlDriverModel(驱动程序模型)DriverBinding(驱动绑定)BusTypes(总线类型)DeviceDriverDesignPatterns(设备驱动程序设计模式)TheBasicDeviceStructure(基本设备结构)Devres-ManagedDeviceResou......
  • percpu 读写信号量 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/percpu-rw-semaphore.html"Percpurwsemaphores"是一种新的读写信号量设计,针对读取操作进行了优化。传统的读写信号量存在一个问题,即当多个核心获取读取锁时,包含信号量的缓存行在各个核心的L1缓存之间反复传输,导致性能下降......
  • 保持内核代码的可抢占安全 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/preempt-locking.html在可抢占内核下的适当锁定:保持内核代码的可抢占安全作者[email protected]介绍可抢占内核会引发新的锁定问题。这些问题与SMP下的问题相同:并发性和可重入性。幸运的是,Linux可抢占内核模型利......
  • java-数据结构
    数据结构A:栈先进后出B:队列先进先出C:数组查询快,增删慢D:链表查询慢,增删快List的三个实现类(1)List的三个实现类特点A:ArrayList底层数据结构是数组,查询快,增删慢线程不安全,效率高B:Vector底层数据结构是数组,查询快,增删慢线程安全,效率低C:LinkedList底层数据结......
  • 通过提示学习进行多级蛋白质结构预训练
    MULTI-LEVELPROTEINSTRUCTUREPRE-TRAININGWITHPROMPTLEARNING通过提示学习进行多级蛋白质结构预训练期刊:ICLR2023作者:浙江大学团队背景蛋白质可以关注不同的结构水平来实现其功能。蛋白质结构有四个不同的层次,第一级是由氨基酸组成的蛋白质序列,第二级是指局部折叠结构,第三季......
  • 序列计数器和顺序锁 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/seqlock.html#序列计数器和顺序锁介绍序列计数器是一种具有无锁读取器(只读重试循环)和无写入者饥饿的读者-写者一致性机制。它们用于很少写入数据的情况(例如系统时间),其中读者希望获得一致的信息集,并且愿意在信息发生变化时重试......
  • 锁定课程 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/spinlocks.html锁定课程课程1:自旋锁用于锁定的最基本原语是自旋锁:staticDEFINE_SPINLOCK(xxx_lock);unsignedlongflags;spin_lock_irqsave(&xxx_lock,flags);...临界区域...spin_unlock_irqrestore(&xxx_lock,fl......