gpt4 book ai didi

c - 使用数组时的 linux 设备驱动程序 container_of 宏

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:54 24 4
gpt4 key购买 nike

在我使用的一个遗留设备驱动程序中,我有一个结构格式如下 -

struct inner_struct_containing_cdev {
struct cdev cdev;
....
....
/* more variables */
};

struct outer_struct {
/* because I need 10 devices */
struct inner_struct_containing_cdev inner[10];
....
....
/* more variables which are common to all the 10 devices. */
};

现在在我的 init_module 中调用 alloc_chrdev_region 和其他与分配相关的调用。现在,在我的带有签名 int open(struct inode *inode, struct file *filp)open 文件操作中,我可以访问 cdev 结构,因此可以访问 inner_struct_containing_cdev 。但我想获得指向 outer_struct 的指针。在 open 调用中,我不知道我收到了指向 inner_struct_containing_cdev 结构的哪个数组索引。在这种情况下是否可以使用 container_of 宏?还是需要重新设计结构?

目前我正在使用全局变量处理这种情况。但这阻止了我进行多重实例化。

最佳答案

您不能使用 container_ofinner_struct_containing_cdevouter_struct;你自己已经说明了原因,你不知道你正在查看数组的哪个索引。

您需要像这样组织您的数据结构:

 struct driver_instance {
/* variables shared among all N devices go here */
};

struct device_instance {
struct cdev cdev;
/* variables particular to only one device */
struct driver_instance *driver;
};

您只使用container_ofcdevdevice_instance;然后取消引用 driver 指针以获取 driver_instance。您在初始化驱动程序时分配一个 driver_instance,然后当它启动各个设备时,它使每个点都指向该对象。使用核心内核的引用计数逻辑来了解何时释放它们。

除了这个,你知道,有效,这意味着你不必在编译时硬连接设备的数量。

关于c - 使用数组时的 linux 设备驱动程序 container_of 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40765847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com