linux内核container_of
时间: 2024-10-28 15:15:22 浏览: 38
`container_of()`是Linux内核中的一个宏,主要用于从指针`ptr`获取指向特定类型`type`结构体的实际地址,这个结构体是在`ptr`所指向的内存区域中存在的,常见于间接访问嵌套的成员变量或者函数指针等场景。
它接受三个参数:
- `ptr`:需要解析的指针。
- `type`:期望找到的结构体类型。
- `member`:`type`结构体内的成员名,通常是另一个指针。
该宏的工作原理是首先计算出`type`类型的指针偏移量,然后从`ptr`位置加上这个偏移量得到真实结构体的地址。例如,如果有一个`struct my_struct`,里面有一个`struct inner_ptr`类型的成员`inner`,你可以这样做:
```c
struct inner_ptr *inner_ptr = ...;
struct my_struct *my_struct = container_of(inner_ptr, struct my_struct, inner);
```
这样`my_struct`就得到了`inner_ptr`所指向的`struct my_struct`实例。
相关问题
linux 内核 container_of
在Linux内核中,container_of是一个宏定义,用于获取包含某个成员的结构体变量的地址。它的定义可以在include/linux/kernel.h中找到。该宏的作用是通过给定的成员指针,返回包含该成员的结构体变量的地址。具体的定义如下:
```c
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
```
这个宏的使用非常方便,可以通过成员指针来获取整个结构体变量的地址。在进行内核驱动开发时,经常会用到这个宏来获取结构体变量的地址,以便进行相关操作。
#### 引用[.reference_title]
- *1* [Linux内核:理解container_of宏](https://blog.csdn.net/qq_28877125/article/details/124209504)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* *3* [Linux内核中container_of的原理及其使用详解](https://blog.csdn.net/u010632165/article/details/107523477)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
linux内核宏container_of如何使用?
在 Linux 内核中,`container_of` 是一个非常常用的宏,它可以通过结构体中某个成员的地址来获取整个结构体变量的地址。
使用方法如下:
```c
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
/* 示例结构体 */
struct student {
char name[20];
int age;
int score;
struct list_head list;
};
/* 示例使用 */
struct student stu;
struct list_head *pos;
/* 假设我们已经有一个指向 list_head 的指针 pos,需要获取整个 student 结构体的地址 */
pos = &stu.list;
struct student *pstu = container_of(pos, struct student, list);
```
这里的 `ptr` 是指向结构体中某个成员的指针,`type` 是结构体的类型,`member` 是结构体中的成员名。
`offsetof` 是另一个宏,用于获取结构体中某个成员相对于结构体起始地址的偏移量。
值得注意的是,`container_of` 宏使用了 GNU 扩展的语法,因此在编译时需要添加 `-std=gnu99` 选项。
阅读全文