内核开发的特点
相对于应用程序的开发,内核开发有很大的不同
最重要的差异包括以下几种:
内核编程时不能访问C库
内核编程时必须使用GNU C
内核编程时缺乏像用户空间那样的内存保护机制
内核编程时浮点数很难使用
内核只有一个很小的定长堆栈
由于内核支持异步中断,抢占和SMP,因此注意同步和并发
1.没有lib库
与用户空间的应用程序不同,内核不能链接使用标准C库函数(其他的那些库也不行)
造成这种情况的原因有很多,其他就包括先有鸡还是先有蛋的问题
不过最主要的原因还是在于速递和大小,对于内核来说,完整的C库太大了
但是大部分常用的C库函数在内核中都已经得到实现,比如说操作字符串的函数数组就位于/lib/string.c文件中,只要包含头文件,就可以使用它们
头文件
我们所说到得头文件,都指的是组成内核源代码树的内核头文件,内核代码文件不能包含外部头文件,就像它们不能用外部库一样,在所有没有实现的函数中,最著名的就数printf()函数了,内核代码虽然无法条用printf(),但是它可以调用printk()函数。
printk()函数负责把格式好的字符串拷贝到内核日志缓冲区上,这样syslog程序就而已通过读取该缓冲区来获取内核信息
printk()用法很像printf()
printk(“hello linux!a string:%s and an integer:%d\n”,a_string,an_integer);
printk()和printf()的区别就是在于printk()允许通过指定一个标志来设置优先级。syslog会根据这个优先级标志来决定在什么地方显示这条系统信息
2.GNU C
linux内核是用c语言编写的,但是内核兵不完全符合ANSI C标准,实际上,只要有可能,内核开发者总是要用到gcc提供的许多语言扩展部分(gcc是多种GNU编译器的集合,它包含的c编译器既可以可以编译内核,也可以编译linux系统上的其他c代码)。内核使用的c语言涵盖了ISO C99标准和GNU C扩展个性
内核代码中所使用到得c语言扩展:
A.内联(inline)函数
通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数
定义个内联函数的时候,需要使用static作为关键字,比如:
static inline void dog(unsigned long tail_size);
内联函数必须在使用前就定义好,不然编译器就没发把这个函数展开
一般在头文件中定义内联函数。由于使用了static作为关键字进行限定,所以编译时不会为内联函数建议一个函数体。如果一个内联函数仅仅只在某个源文件中使用,那么也而已把它定义在该文件的开始地方
3.内联汇编
gcc编译器支持在c函数中嵌入汇编指令,当在内核编程的时候,只有知道对应的体系结构,才能使用这个功能
linux的内核混合使用了c和汇编语言,在偏近体系结构的底层或者对执行时间要求严格的地方,一般使用的都是汇编,而内核其他部分的大部分代码是c语言写的
4.分支声明
对于条件选择语句,gcc内建议一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分支选择进行优化,内核把这条指令封装成了宏,比如likely()和unlikely()这样使用起来比较的方便
例如.下面是一个条件选择语句:
if(foo){
/*......*/
}
如果想要把这个选择标记成绝少发生的分支:
认为foo绝大多数时间都会为0
if(unlikely(foo)){
/*...*/
}
相反如果我们想把一个分支标记为通常为真的选择
if(likely(foo)){
/*.........*/
}
5.没有内存保护机制
如果一个用户程序试图进行一次非法的内存访问,内核会发现这个错误,发送SIGSEGV,并结束整个进程,然而内核自己访问了非法内存,那后果就是很难控制了,内核发生的内存错误会导致oopt,这是内核中出现的最常见的一类错误,在内核中,不应该去做访问非法内存地址,引用空指针之类的事情,否则它会可能死掉,却根本不知道通知你一声。
此外,内核中的额内存都不分页,也就是说,没用掉一个字节,物理内存就减少一个字节
6。不要轻易在内核中使用浮点数
在用户空间内进行浮点操作时候,内核会完成从整数操作到浮点数操作的模式转换,在执行浮点指令时到底会做什么,因体系结构不同,内核的选择也不同,但是,内核通常捕获陷阱并作出相应的处理
7.容积小而固定的栈
内核栈的标准大小随着体系结构而变,在x86上,栈的大小在编译时配置,可以是4kb也可以是8kb,32位机得内核栈是8kb,64位机是16kb这是固定不变的。每个处理器都会有自己的栈
8.同步和并发
内核很容易产生竞争条件,和单线程的用户空间程序不同,内核在许多特性都要求能够并发的共享书u,这就要求有同步机制保证不会出现竞争条件
解决竞争的办法是自旋锁和信号量
阅读(2159) | 评论(0) | 转发(0) |