[Linux内核设计与实现]Linux内核开发特点

来源:互联网 发布:wifi破解mac版 编辑:程序博客网 时间:2024/04/28 23:45

Linux内核开发特点:

  1. 内核编程时不能访问标准C库;
  2. 内核编程时必须使用GNU C;
  3. 内核编程时缺乏像用户空间那样的内存保护机制;
  4. 内核编程时浮点数很难使用;
  5. 内核只有一个很小的定长堆栈;
  6. 由于内核支持异步中断,抢占和SMP,因此必须时刻注意同步和并发控制;
  7. 内核编程要考虑可移植性。

没有libc库

与用户空间的应用程序不同,内核不能链接使用标准C函数库,其他函数库也不能使用。对于内核来说,完整的C库太大了,即使从中抽取一个合适的子集,在大小和效率方面也不能接受。不过大部分常用的C库函数在内核中都已经得到了实现。


GNU C

内核使用C语言编写,但是内核不完全符合ANSI C标准。内核开发者总是要用到gcc提供的许多语言扩展部分。内核代码中常使用的C语言扩展有下面几点:

内联(inline)函数,使用static inline来声明;

内联汇编,gcc编译器支持在C中嵌入汇编语言;

分支声明,gcc内建了一条指令来优化条件选择语句,比如likely(),unlikely()。


没有内存保护机制

用户程序试图进行一些非法内存访问时,内核会发现这个错误,发送SIGSEGV,并结束用户进程。然而,内核自己访问了非法内存将会导致oops。所以内核开发时,对内存的操作一定要小心。此外,内核中的内存不能分页。也就是说每用掉一个字节,物理内存就会减少一个字节。


容量小而固定的栈

内核栈的准确大小随体系结构而变。在x86上,栈的大小在编译时配置,可以是4kb也可以是8kb。从历史上说,内核栈的大小是两页,这就意味着,32位机器的内核栈是8kb,而64位机器的内核栈大小是16kb。


同步和并发

内核很容易产生竞争条件。体现在以下方面:

Linux内核是抢占多任务操作系统;

Linux内核支持多处理器系统;

中断是异步到来,完全不顾及当前正在执行的代码;

Linux内核可以抢占。


可移植性的重要性

Linux是一个可以移植的操作系统,必须把体系结构相关的代码从内核代码树的特定目录中分离出来。



参考资料:

《Linux内核设计与实现》,第二版


原创粉丝点击