内核开发的特点
内核编程时不能访问C库。
内核编程时必须使用GNU C。
内核编程时缺乏像用户空间那样的内存保护机制。
内核编程时浮点数很难使用。
内核只有一个很小的定长堆栈。
由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发。
要考虑可移植性的重要性。
GCC 特有的一些东西
内联(inline)函数
定义一个内联函数的时候,需要使用static作为关键字,并且用inline限定它。比如:
static inline void dog(unsigned long tail_size)
内联函数必须在使用之前就定义好,否则编译器就没法把这个函数展开。实践中一般在头文件中定义内联函数。由于使用了static作为关键字进行限制,所以编译时不会为内联函数单独建立一个函数体。如果一个内联函数仅仅在某个源文件中使用,那么也可以把它定义在该文件开始的地方。
在内核中,为了类型安全的原因,优先使用内联函数而不是复杂的宏。
内联汇编
一般是在相应的体系结构里面用的, ARM 混合 C 编程的时候这样用过.
分支声明
就是把概率出现较小的分支用 宏 unlikely() 对 条件表达式定义下,应该就是物理内存尽可能不出现他.
例如,下面是一个条件选择语句:
if (foo) {
/* ... */
}
如果想要把这个选择标记成绝少发生的分支:
/* 我们认为foo绝大多数时间都会为0... */
if (unlikely(foo)) {
/* ... */
}
相反,如果我们想把一个分支标记为通常为真的选择:
/* 我们认为foo通常都不会为0 */
if (likely(foo)) {
/* ... */
}
没有内存保护机制
....