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

}

posted @ 2018-03-22 23:08  Lord_Age  阅读(300)  评论(0)    收藏  举报