- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我使用的一个遗留设备驱动程序中,我有一个结构格式如下 -
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_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
,然后当它启动各个设备时,它使每个点都指向该对象。使用核心内核的引用计数逻辑来了解何时释放它们。
除了这个,你知道,有效,这意味着你不必在编译时硬连接设备的数量。
关于c - 使用数组时的 linux 设备驱动程序 container_of 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40765847/
List.h 定义了一个名为 list_entry 的宏,它是 container_of() 函数的包装器。一个优雅的函数,看起来很精致: 考虑这段代码: tmp = list_entry(pos,(
这个问题在这里已经有了答案: Rationale behind the container_of macro in linux/list.h (1 个回答) 关闭 9 年前。 嗨,为什么 conta
谁能给我解释一下这两个宏? #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(pt
我不确定我做错了什么,但现在是时候多加留意了。我使用 device_create() 制作一个设备,提供一些“额外数据”,如下所示: pDevice = device_create(ahcip
我试图通过编写一个小程序来理解 container_of 宏,但我没有得到预期的结果。我写的程序是: typedef struct node { int id1; int id2;
如果我有: struct my_container { int x; struct some_struct *ss; } 如果我有指针 ss,通过它我可以访问 some_struct
我尝试在 linux 内核中使用 container_of 宏。 我通过google得到的结果如下 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *
我是一个尝试编写串行驱动程序(基于 PCI)的新手,我不想使用 container_of() 因为缺乏向下兼容性。我可能会编译模块的内核版本将是 use_count )。我不想使用 container
例如在 Linux 驱动程序开发中,可以找到 container_of宏。本质上,它是 -> 的反向运算符,如果您获得指向成员的指针,则生成指向包含结构的指针。 除了 Greg Kroah 的博客之外
Linux内核(和其他地方)中常用的宏是container_of,其(基本上)定义如下: #define container_of(ptr, type, member) (((type) *)((ch
我知道宏是做什么的。 在许多内核级代码中,经常使用它来遍历链表。 我想找到其他有用的案例。 你什么时候使用 container_of 或 CONTAINING_RECORD宏? 什么时候宏非常有用?
我想知道如何使用 container_of 设置 epoll。我正在使用最新版本的 ubuntu 和 eclipse-cdt (gcc)。我的想法是抓取事件,然后抓取事件来自的容器。 如果我有这样的结
我正在编写一个访问 PCI 卡的简单字符驱动程序。它在新类的帮助下注册到 sysfs。现在我想以一种方便的方式访问设备的多个参数(即版本、状态、控制......)。我想向设备注册多个属性(通过 dev
我正在阅读 John Madieu 的 Linux Device Drivers Development,其中一段说 The container_of macro won't work for cha
我一直在使用我自己的 container_of 类型函数,它不依赖于 GNU 或 C99,(即,它适用于不同版本的 MSVC。) #include /* offsetof */ #include
宏定义为 #define container_of(ptr, type, member) ({ \ const typeof( ((type
我们有container_of的链表实现如下: #define container_of(ptr, type, member) ({ const typeof( ((type *)0)->memb
我想从头开始实现 container_of 宏/函数,就像 linux 内核中可用的那样,以从父结构的成员获取父结构的地址。 例如如果父结构是 struct parent{ int id; struc
在查看 Linux 内核的双向链接循环列表实现时,我发现了以下宏: #define container_of(ptr, type, member) ({ \ const typeo
我正在尝试访问内核链表,结构是 struct my_struct { struct my_hardware_context ahw; struct net_device *netdev; struct
我是一名优秀的程序员,十分优秀!