在我使用的其中一个遗留设备驱动程序中,我的结构格式如下 -
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
和其他与分配相关的调用。现在,在我的open
文件操作中,签名为int open(struct inode *inode, struct file *filp)
,我可以访问cdev结构,从而访问inner_struct_containing_cdev
。但我希望得到指向outer_struct
的指针。在open
调用中,我不知道我收到指针的inner_struct_containing_cdev
结构的哪个数组索引。
在这种情况下是否可以使用container_of
宏?或者需要重新设计结构?
目前我正在使用全局变量来处理这种情况。但这阻止了我进行多次实例化。
答案 0 :(得分:1)
您无法使用container_of
从inner_struct_containing_cdev
转到outer_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_of
从cdev
转到device_instance
;然后取消引用driver
指针以获取driver_instance
。在初始化驱动程序时分配driver_instance
,然后当它旋转单个设备时,它会使每个指向该对象。使用核心内核的引用计数逻辑来知道何时解除分配它们。
除了这个,你知道,工作之外,这意味着你不必在编译时硬连接设备的数量。