Linux内核开发不同于用户空间的应用程序开发,有其一些独特之处。首先内核可以做它想做的任何事,这是它的优势,但还是有一些方面区别于应用开发过程,需要特别引起注意:
- 内核编程时既不能访问C库等外部库也不能访问标准的C头文件
- 内核编程时必须使用GNU C
- 内核编程时缺乏像用户控件那样的内存保护机制
- 内核编程时难以执行浮点运算
- 内核给每个进程只有一个很小的定长堆栈
- 由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发
- 要考虑可移植性的重要性
- 基本的头文件位于内核源代码树*目录下的include目录中,例如头文件<linux/inotify.h>对应内核源代码树的include/linux/inotify.h文件。
- 体系结构相关的头文件集位于内核源代码树的arch/<architecture>/include/asm目录下。例如x86体系结构相关的头文件就在arch/x86/include/asm目录下,内核代码通过asm/为前缀的方式来包含这些头文件,例如<asm/ioctl.h>。
1.2 内核编程时使用GNU C
1.3 内核没有内存保护机制 内核编程时一定要谨慎。另外内核中的内存都不分页,也就是说你每用掉一个字节,物理内存就减少一个字节,所以在往内核里加入新功能时一定要小心。
1.4 内核中尽量不要执行浮点运算
1.5 内核中每个进程的栈都是固定的且很小,由编译时配置决定其大小,一般为2K~8K。
1.6 同步和并发 常用的解决竞争的办法是自旋锁和信号量。
1.7 可移植性非常重要