内核开发特点
无C库或标准头文件
库和头文件的区别
-
头文件是文本文件,可以阅读编写更改;而库文件是二进制文件,已经预先编译完成,无法直接阅读。
-
头文件在编译预处理阶段被处理插入程序文本;而库文件这是在编译链接阶段由链接器与源文件合并。(对此处有疑问的同志可以查看c程序的编译过程,如CSAPP 1.2程序被其他程序翻译成不同的格式)
编程必须使用GNU C
我对内联函数的理解
在程序文件中“写”/定义一次,在需要使用的地方“标记”引用,在编译程序时系统自动将定义的函数展开加入到字段中。
内联函数与函数调用的本质区别
没有单独在其他物理位置创建函数体,而是被展开在文件代码中,这样也就省去了调用通信的时间消耗(优点),但同时代码会变长,占用更多内存空间或指令缓存(缺点)。
- 也因为上面的区别在定义内联函数时需要使用
static为关键字,并用inline限定。例如:
// include/linux/skbuff.h
static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
这里使用static关键字就是使系统在编译时不会为内联函数单独开辟函数体的空间。
分支声明
使用unlikely()对绝少发生的分支进行标记优化。例如:
/* 假设error绝大多数时间为0,即极少出错 */
if(unlikely(error)){
/* *** */
}
likely()的使用同理。
- 因为分支一般判断特殊情况,所以unlikely()的使用更加广泛。
读书时的疑问
- 优化分支条件,需要正确判断条件是否绝少或通常发生;此处可否运用聚类算法?
- 进程和线程概率的区别。(在第三章就会有一个初步的认识)