开头就说明了这里的 list.h 文件来自 Linux Kernel ( */include/linux/list.h ),只是去除了列表项的硬件预加载部分。
进行宏替换后就是
Note: 没搞懂这里为什么加个 osn 前缀,原本是 list_add ,现在是 osn_list_add 。
可以看到就是个简单的链表节点删除过程,同时把删除节点的前后指针设为无法访问。
删除节点后初始化,前后指针都指向自己
从A链表删除后头插法插入B链表
从A链表删除后尾插法插入B链表
先对 list 判空,非空就把 list 链表除头节点外裁剪到 head 头节点在的链表中。函数不安全, list 节点可以继续访问其他节点。
多了一步 list 重新初始化的过程。
(unsigned long)(&((type *)0)->member))) 将0x0地址强制转换为 type * 类型,然后取 type 中的成员 member 地址,因为起始地址为0,得到的 member 的地址就直接是该成员相对于 type 对象的偏移地址了。
所以该语句的功能是:得到 type 类型对象中 member 成员的地址偏移量。
先将 ptr 强制转换为 char * 类型(因为 char * 类型进行加减的话,加减量为 sizeof(char)*offset , char 占一个字节空间,这样指针加减的步长就是1个字节,实现加一减一。)
整句话的意思就是:得到指向 type 的指针,已知成员的地址,然后减去这个成员相对于整个结构对象的地址偏移量,得到这个数据对象的地址。
就是从前往后,从后往前的区别
Note: 从head节点开始(不包括head节点!)遍历它的每一个节点!它用n先将下一个要遍历的节点保存起来,防止删除本节点后,无法找到下一个节点,而出现错误!
已知指向某个结构体的指针pos,以及指向它中member成员的指针head,从下一个结构体开始向后遍历这个结构体链
Note: 同理,先保存下一个要遍历的节点!从head下一个节点向后遍历链表。
list.h使用说明
linux内核list.h分析(一)
linux内核list.h分析(二)
【Linux内核数据结构】最为经典的链表list
Linux 内核中可使用宏 __setup() 处理内核的启动参数 cmdline 的解析。
文件: include/linux/init.h
定义:
通过宏展开可以看出:宏 __setup() 主要是定义了一个 obs_kernel_param 类型的结构体变量 __setup_fn 。
以 RockPI 4A 单板 Debian 系统 Linux 4.4 内核为例,介绍 init 参数的解析方法。
1、cmdline参数
在 Debian 系统中,通过 extlinux.conf 文件传递启动参数,其中 init=/sbin/init ,如下:
2、__setup()宏定义
在 Linux 内核中,解析 init 参数的 __setup() 实现如下:
3、__setup()宏展开
展开宏 __setup("init=", init_setup) ,即:
内核编译完成后,在内核符号表 System.map 文件中,可以看到 __setup_init_setup :
4、函数调用流程
内核启动后, init_setup() 函数的调用流程如下:
《Linux内核探秘深入解析文件系统》百度网盘pdf最新全集下载:
链接: https://pan.baidu.com/s/10_gfLOVNEpy-TAzONQ0pvA
?pwd=bk5f 提取码: bk5f简介:《Linux内核探秘:深入解析文件系统和设备驱动的架构与设计》从工业需求角度出发,注重效率和实用性,是帮助内核研发及调试、驱动开发等领域工程师正确认识并高效利用Linux内核的难得佳作!作者是腾讯公司资深的Linux内核专家和存储系统专家,在该领域工作和研究的10余年间,面试了数百位Linux内核工程师,深知学习Linux内核过程中经常遇到的困惑,以及在工作中容易犯的错误。基于这些原因作者撰写了《Linux内核探秘:深入解析文件系统和设备驱动的架构与设计》。《Linux内核探秘:深入解析文件系统和设备驱动的架构与设计》出发点和写作方式可谓独辟蹊径,将Linux内核分为两个维度,一是基础部分和应用部分,二是内核架构和内核实现,将两个维有机统一,深入分析了Linux内核的文件系统、设备驱动的架构设计与实现原理。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)