首页 > 其他分享 >设备驱动设计模式 【ChatGPT】

设备驱动设计模式 【ChatGPT】

时间:2023-12-10 13:12:42浏览次数:33  
标签:... foo struct work 驱动 ChatGPT 设计模式 指针

设备驱动设计模式

这份文档描述了设备驱动中常见的设计模式。子系统维护者可能会要求驱动开发者遵循这些设计模式。

  1. 状态容器
  2. container_of()

1. 状态容器

虽然内核中包含一些设备驱动,假定它们只会在特定系统上被 probed() 一次(单例模式),但通常假定驱动绑定的设备会出现多个实例。这意味着 probe() 函数和所有回调函数都需要是可重入的。

实现这一点最常见的方式是使用状态容器设计模式。通常采用以下形式:

struct foo {
    spinlock_t lock; /* 示例成员 */
    (...)
};

static int foo_probe(...)
{
    struct foo *foo;

    foo = devm_kzalloc(dev, sizeof(*foo), GFP_KERNEL);
    if (!foo)
        return -ENOMEM;
    spin_lock_init(&foo->lock);
    (...)
}

每次调用 probe() 都会在内存中创建一个 struct foo 的实例。这就是该设备驱动实例的状态容器。当然,随后需要将该状态实例传递给所有需要访问状态及其成员的函数。

例如,如果驱动正在注册中断处理程序,你需要这样传递指向 struct foo 的指针:

static irqreturn_t foo_handler(int irq, void *arg)
{
    struct foo *foo = arg;
    (...)
}

static int foo_probe(...)
{
    struct foo *foo;

    (...)
    ret = request_irq(irq, foo_handler, 0, "foo", foo);
}

这样你就能在中断处理程序中始终获得指向正确的 foo 实例的指针。

2. container_of()

在上面的示例中,我们添加了一个 offloaded work:

struct foo {
    spinlock_t lock;
    struct workqueue_struct *wq;
    struct work_struct offload;
    (...)
};

static void foo_work(struct work_struct *work)
{
    struct foo *foo = container_of(work, struct foo, offload);

    (...)
}

static irqreturn_t foo_handler(int irq, void *arg)
{
    struct foo *foo = arg;

    queue_work(foo->wq, &foo->offload);
    (...)
}

static int foo_probe(...)
{
    struct foo *foo;

    foo->wq = create_singlethread_workqueue("foo-wq");
    INIT_WORK(&foo->offload, foo_work);
    (...)
}

对于 hrtimer 或类似的东西,返回的单一参数是指向回调中的结构成员的指针,设计模式是相同的。

container_of() 是在 <linux/kernel.h> 中定义的宏。

container_of() 的作用是通过使用标准 C 中的 offsetof() 宏进行简单的减法运算,从成员指针中获取包含结构的指针,这允许类似面向对象的行为。请注意,被包含的成员不能是指针,而必须是实际的成员才能起作用。

通过这种方式,我们避免了全局指针指向我们的 struct foo * 实例,同时仍然将传递给工作函数的参数数量保持为单一指针。

标签:...,foo,struct,work,驱动,ChatGPT,设计模式,指针
From: https://www.cnblogs.com/pengdonglin137/p/17892425.html

相关文章

  • 设备基本结构 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/driver-model/device.html设备基本结构请参阅内核文档以了解structdevice的结构。编程接口发现设备的总线驱动程序使用以下方法将设备注册到核心:intdevice_register(structdevice*dev);总线应该初始化以下字段:p......
  • 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可抢占内核模型利......
  • 序列计数器和顺序锁 【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......
  • RT-mutex 实现设计【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/rt-mutex-design.htmlRT-mutex实现设计版权所有(c)2006StevenRostedt根据GNU自由文档许可证第1.2版许可本文档试图描述rtmutex.c实现的设计。它并不描述rtmutex.c存在的原因。有关此内容,请参阅带PI支持的RT-m......