<aside> 💡 总结了 Linux 内核实现中常用的数据结构、函数、宏等基础设计
</aside>
在用户态下试运行内核函数、数据结构的方法:
> gcc -D__KERNEL__ -I/usr/src/linux-2.6.7/include pfile.c -o pfile
list_head
是双向链表指针域的实现:
struct list_head {
list_head *next;
list_head *prev;
}
数据结构通过引入一个list_head
成员变量来组织成为双向链表,数据域的访问通过结构体地址偏移量(offset)来实现。
list_entry(ptr, type, mem)
:访问数据域(和 kobject 的 container_of 宏一样)LIST_HEAD()
:创建头节点(伪数据)list_add()
and etcPTR_ERR()
指针转化为错误码ERR_PTR()
错误码转化为指针IS_ERR()
判断指针地址是否错误——当指针指向内核保留内存区页框时,视为错误unlikely(<cond>)
& likely(<cond>)
指代某个分支(cond)是否更有可能发生,来指导编译器进行对应的优化,减少程序跳转开销。
<aside> 🗣 Read-Copy-Update 是 Linux 的一种无锁同步机制
</aside>