linux内核第一宏 container_of】的更多相关文章

内核第一宏 list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针.现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一宏设计的精妙之处. 整理分析的思路 list_entry()在内核源代码/include/linux目录下的list.h中被定义,如下: 在list_entry的定义中,我们看到出现了另外一个宏container_of.而list_entry这个宏正是通过container_of去实现的.所以我们要先进入container _…
4.1 typeof 关键字 ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数.GNU C 扩展了一个关键字 typeof,用来获取一个变量或表达式的类型.这里使用关键字可能不太合适,因为毕竟 typeof 还没有被写入 C 标准,是 GCC 扩展的一个关键字.为了方便,我们就姑且称之为关键字吧. 通过使用 typeof,我们可以获取一个变量或表达式的类型.所以 typeof 的参数有两种形式:表达式或类型. int i ; ; ​ typeof(i…
Linux Kernel Version 4.14 1. container_of是干什么的? 已知一个结构体中某个成员的首指针,那么就可以通过宏container_of来获得此结构体的首指针 2 先看看container_of是如何定义的吧 #define container_of(ptr, type, member) \ (type *)(()->member) 解析一下各参数: ptr: 结构体成员的指针 type: 结构体的类型 member: 结构体成员的名字 2. 举一个例子 2.1…
转载http://blog.chinaunix.net/uid-7390305-id-2057287.html 看一下/usr/include/asm/linkage.h里面的定义:#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) 其中 __attribute__是关键字,是gcc的C语言扩展. __attribute__机制是GNU C的一大特色,它可以设置函数属性.变量属性和类型属性等.可以通过它们向编译器提供更多数据…
1 Linux内核简介 1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.TCP/IP等新的特性. 2.Unix的特点: Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的: 在Unix中,所有的东西都被当做文件对待. Unix的内核和相关的系统工具软件是用C语言编写的,具有强大的移植能力 Unix的进程创建非常迅速,并且有一个非常独特的fork()系统调用. Unix提供了一套非常简单但又很稳定的进程间通信元语,快速简洁的进程创建过程使Unix的程序把目标放在一次…
我们在阅读Linux内核是,常见到这些宏 __init, __initdata, __initfunc(), asmlinkage, ENTRY(), FASTCALL()等等.它们定义在 /include/linux/init.h 和 /include/linux/linkage.h 以及其他一些.h 文件中. 1. __init 位置:/include/linux/init.h 定义: #define __init   __attribute__ ((__section__ (".init.…
存储程序计算机工作模型 存储程序计算机——冯诺依曼体系结构 IP:寄存器,总是指向内存的代码段.IP(16位) 32位(EIP) 64位(RIP). 内存:保存数据和指令. CPU:CPU从IP指向的内存地址取指令执行,执行之后IP自加一,然后继续执行 for(;;){ next instruction } API:应用程序编程接口.程序员与计算机的接口界面. ABI:程序与CPU接口界面(二进制编码). X86寄存器 通用寄存器 段寄存器 CS:代码段寄存器,存储指令.CPU取指令时根据CS+…
/usr/src/linux-source-3.8.0/drivers/gpu/drm/radeon 这个文件夹以下 去找到这个文件 mkregtable.c  打开,就能够看到了. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) /** * container_of - cast a member of a structure out to the containing structure * @ptr: the…
1. 先看看它们长啥样吧!(它们有两种定义,第一种是使能了程序trace功能的宏定义,第二种是普通的宏定义,咱们分析普通宏定义吧) # define likely(x) __builtin_expect(!!(x), ) # define unlikely(x) __builtin_expect(!!(x), ) 2. 从宏中我们可以看到__builtin_expect,这是什么? 这是gcc内置的函数,用来进行分支预测 3. 总是听大家说这样做可以优化性能,但是怎么做到的呢? 3.1 arm处…
这个 pci_device_id 结构需要被输出到用户空间, 来允许热插拔和模块加载系统知道什 么模块使用什么硬件设备. 宏 MODULE_DEVICE_TABLE 完成这个. 例如: MODULE_DEVICE_TABLE(pci, i810_ids); 这个语句创建一个局部变量称为 mod_pci_device_table, 它指向 struct pci_device_id 的列表. 稍后在内核建立过程中, depmod 程序在所有的模块中寻找 mod_pci_device_table. 如…