Linux内核设计与实现第二章读书笔记

71 阅读2分钟

内核开发特点

无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()的使用更加广泛。

读书时的疑问

  1. 优化分支条件,需要正确判断条件是否绝少或通常发生;此处可否运用聚类算法?
  2. 进程和线程概率的区别。(在第三章就会有一个初步的认识)