1 linux内核 并不区分线程和进程。对于内核来说,所有的线程和进程都一样,只是其中的一些共享资源而已。
2 内核开发特点:
2.1 linux内核开发不能使用c函数库,因为c库需要操作系统的支持,而且c库的大小和效率也是内核开发所不能容忍的;
但是大部分c库函数在内核中都是被实现了。只要包含内核代码 中相应的头文件,就能够使用相应的类似函数;
2.2 linux内核开发只能使用GNU c标准;
linux内核并不安全符合ANSI C标准,用到了许多gcc提供的语言扩展部分:
2.2.1 内联(inline)函数,gcc支持内联函数(ANSI C在C99中也开始支持inline)。定义一个内联函数的时候,要使用static关键
字进行限定 (为什么需要static关键字,参考《gcc的内联支持》),并且内联函数常在头文件中定义。
2.2.2 内联汇编。gcc支持在c语言代码中嵌入汇编代码。
2.2.3 分支声明。对于条件选择语句,gcc内建了一条指令用于优化。如果一个条件为真或为假的概率比较大,那么编译器就可以根
据该指令对条件分支选择进行优化。
内核把这条指令封装成了宏,比如likely()和unlikyle(),以方便使用,例如:
(1) /*foo很少为真*/
if (unlikely(foo)) {
/* ... */
}
(2) /*foo很有可能为真*/
if (likely(foo)) {
/* ... */
}
但是在使用之前,一定要对条件是否为真有正确的判断,否则可能引起性能下降。在对一些错误条件进行判断时,常会使用到。
2.3 内核开发缺乏类似用户空间的内存保护机制;
2.4 内核之用一个很小的定长堆栈供开发使用;
内核栈不能动态增长而且很小。32位系统为8kB,而64位为16kB。
2.5 内核开发时浮点是很难使用;
2.6 内核支持异步中断,抢占和smp,所以要时刻注意同步和并发;