linux kernal作业弱智笔记
因为这个笔记记的确实够弱智,所以就决定叫弱智笔记好了(废话)
此笔记主要记录Project中用到的一些函数的具体意思。有一部分我也是从网上找的,所以我这部分更多的是用更直白(弱智)的语言来解释一遍用法。
首先是list_head这个结构体,它包含两个指向同类型结构体的指针:*next 和*prev。
struct list_head {
struct list_head *next, *prev;
};
LIST_HEAD这个宏的定义为将自己赋值给自己
首先复习一段(我这块就是忘掉了C语言结构体的调用才卡了老半天。。。
struct testStruct = {var1, var2, var3},即为结构体的直接赋值方式。所以LIST_HEAD的实际效果是:
struct list_head name = {&(name),&(name)},其中的两个括号分别将name的地址赋值给了next指针和prev指针。而“ {&(name),&(name)}”部分被linux重新定义为宏:LIST_HEAD_INIT(name) { &(name), &(name) }
这个宏(Macro)的意思是当我调用LIST_HEAD_INIT这个宏的时候,输入name变量,则会自动代表“{ &(name), &(name) }”这个内容,而这正是赋值结构体的一种表示方式(struct list_head name = {&(name),&(name)})例如:
如下代码为结构体:
struct birthdayTest{ int day; int month; int year; };
这个是我们的宏:
#define BIRTHMACRO(x) {x+10, x+10, x+1995}
这个BIRTHMACRO宏的意思是输入一个变量x,则会自动生成三个数字
因此,我们可以用如下方式定义一个结构体:
struct birthdayTest birthdatTest_1 = BIRTHMACRO(10);
输出结果如下:
20, 20, 2005
所以,LIST_HEAD(name)的实际定义为:
LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name)
“\”代表换行
INIT_LIST_HEAD(ptr)的宏的实际效果为:
INIT_LIST_HEAD(ptr) do{ (ptr)->next=(ptr); (ptr)->prev=(ptr); }while(0)
。需要注意的是,do...while(0)是只运行一次的循环,至于为什么这么写请查找宏的相关写法优化
关于遍历:遍历需要通过“{}”来进行相关操作。例如
LIST_EACH_ENTRY(var1, var2){
``//your code
}

浙公网安备 33010602011771号