http://blog.csdn.net/mndscc/article/details/46803917
* 之前一直不理解((type *)0->member)是啥意思;甚至之前还在测试这种用法是否正确。
* 这次在看list_entry的时候,又发现了这个用法。
* 是在offsetof(type,member)中被调用的,
* 原宏为:
#define offsetof(type,member) ((size_t) &((type *)0)->member)
* size_t 是内核中的一种数据类型。是无符号的长整形。
* 这个宏的作用是,计算元素member在其所在结构提type中的偏移量。
* 那 看代码,还是不理解 。这不是在取member的地址么,还强制转化成size_t类型,
* 怎么就是他在里面的偏移量了呢?甚至,用0->取元素,这种用法对还是错呢?
* 哈哈,其实,重点就在用0->取元素上。
*
* 我们知道,定义结构体,内存会分配一块连续内存。结构体变量名也是该块连续内存的首地址。
* 平时取元素 ,也是利用偏移量来进行操作。
* 结构体内某一个元素的地址 = 结构体变量地址(即首地址)+ 偏移量。
* 所以,如果结构体变量地址 == 0;
* 该元素的地址 == 偏移量。
* 所以,利用这样的小技巧,通过从0(NULL)作为首地址取元素,
* 只要获取该元素的地址,就是该元素在其结构体内的偏移量了。
真的感叹c语言的巧妙,以及内核代码的构思,真真的灵活运用啊!
相关推荐
通过对Linux内核中链表和散列表实现原理的分析,我们可以看出,这些数据结构的设计充分考虑了性能优化和代码的简洁性。双向循环链表适用于频繁插入和删除的场景,而散列表则适合于需要快速查找的场合。此外,`...
在遍历链表时,由于`entry`在`node`结构体中的声明位置不固定,Linux内核使用了`offsetof`和`container_of`这两个宏来计算结构体成员变量的地址,从而进行遍历。这样做是为了在不知道`entry`位置的情况下,仍能灵活...
### Linux内核list&hlist解读 #### 1. 前言 Linux 内核中广泛使用了链表作为数据结构,为了更好地管理和操作这些链表,内核提供了一系列宏来帮助开发者进行高效的数据处理。本文将详细介绍 Linux 内核中的两种主要...
_syscall0 (int, fork) // 是unistd.h 中的内嵌宏代码。以嵌入汇编的形式调用 // Linux 的系统调用中断0x80。该中断是所有系统调用的 // 入口。该条语句实际上是int fork()创建进程系统调用。 // syscall0 名称...
在Linux环境下,有两个经典的宏定义,它们分别是`offsetof`和`container_of`,这两个宏在系统内核编程和底层开发中非常常见。 1. `offsetof`宏定义: `offsetof`宏的主要作用是计算一个结构体成员相对于结构体起始...
Linux内核中的`container_of`函数是一个至关重要的宏,它被广泛应用于各种数据结构,如链表、工作队列等。这个宏的主要功能是从给定的结构体成员指针反向推导出整个结构体的首地址。在复杂的内核编程中,这种能力极...
`container_of`宏是Linux内核中用于从链表节点恢复持有该节点的数据结构的指针的关键工具。这个宏的定义如下: ```c #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *mptr ...
`offsetof`宏的一个常见应用是在实现通用数据结构时,例如Linux内核中使用的`container_of`宏,它允许从嵌套元素的指针反向找到包含它的结构体。`container_of`宏的定义如下: ```c #define container_of(ptr, type...
Linux 头文件 Linux 头文件是 Linux 操作系统中的一组重要文件,用于提供系统函数原型和数据...这些头文件提供了 Linux 操作系统的基本功能和数据结构的定义,从而为编写操作系统实验代码的教师提供了必要的支持。
Linux内核专用头文件子目录`include/linux` - **`<linux/config.h>`**:内核配置头文件,包含了内核编译时的配置选项。 - **`<linux/fdreg.h>`**:软盘驱动器控制头文件,包含软驱控制器的参数定义。 - **`...
这个宏在Linux内核中广泛使用,用于从结构体中的某个成员指针反向推导出整个结构体的指针。其基本原理是利用了结构体成员在内存中的相对位置。`offsetof`宏用于计算结构体成员相对于结构体起始地址的偏移量。例如,`...
Linux内核态和用户态之间的通信方式包括系统调用、信号量、管道、套接字等。其中,系统调用是最常用的通信方式。它允许用户态进程请求内核态服务,而内核态将根据请求执行相应的操作。 四、系统设计 1. 子系统X的...
* 实现 Linux 内核中的container_of宏等。 C语言结构体是一种非常强大的数据结构,能够帮助程序员组织和管理数据。通过深入剖析C语言结构体,我们可以更好地理解和应用结构体,提高编程效率和代码质量。
对于Linux内核这样的高性能系统,对结构体的精心设计和优化可以显著提升性能。同时,理解结构体偏移也有助于深入理解C语言中的指针和内存管理,这对于进行系统级编程和调试是至关重要的。 总之,结构体偏移是C语言...