Linux内核开发与普通应用开发的不同之处

虽然内核使用C语言开发,但还是和应用程序的开发有很大不同。

 

1、使用GNU C编写,但不能使用C标准库以及标准头文件,当然也就不能使用其他库。

不使用标准库的原因有很多,考虑最多的就是空间和速度。C标准库对于内核来说效率不高,而且C标准库的体积也太过庞大。但是内核也需要很多类似标准库中某些函数的功能,所以内核开发者也实现了这些函数,如kmalloc,kfree,printk等。一般这些函数位于内核代码树中include和arch//include/asm目录下。

Linux内核开发使用的并不是ANSI C而是GNU C,你从内核中随处可见使用GCC扩展功能的地方,有些地方还使用了ISO C99的扩展。常用的扩展包括内联函数,内联汇编代码,分支注释(使用unlikely和likely提示分支条件成立的概率大小,主要目的是在流水线中较好的进行分支预测)。

2、没有内存保护机制

内核虽然可以为应用程序提供内存保护,避免各个程序之间相互干扰,但他对于自己却管教甚宽,而且没有什么可以去监视内核的行动。而且,和应用程序的虚拟地址空间不同,内核中每使用一个字节的内存,就意味这物理内存减少了一个字节。

3、不能进行浮点运算

浮点运算对于程序员来说相当常见,但是对于内核,应该尽量避免使用浮点运算,尽量使用整数运算代替。

4、每个程序对应一个堆栈,但堆栈大小时固定的。

内核堆栈一般是两页。

5、由于内核与硬件打交道,所以同步、并行以及可移植性很重要。

虽然linux刚开始是针对intel的i386进行开发,但现在它已经可以运行在几乎所有的平台上,所以可移植性很重要,其中最重要的是数据类型的不同,字节序问题等。

由于内核与硬件打交道,对于竞争条件相当敏感。现在的内核已经实现了可抢占,可重入,当然,这是通过复杂的同步机制实现的。内核不仅要在多个进程之间进行同步,还要在SMP架构的处理器之间进行同步。更为复杂的是对于异步中断的处理。

linux内核提供了多种同步方案,包括锁,互斥量,信号量,以及各种屏蔽中断的处理等。

 

你可能感兴趣的:(Linux内核学习)