内核编程的几个特点
1. 不能访问C库或是其它库(鸡、蛋……)
这点比较好理解,内核空间与用户空间不同,但主要原因是效率问题,而且内核中也实现了大多数常用的C库函数。
2. 必须使用GNU C(Linux内核不完全符合ANSI C标准)
内核开发者使用了gcc提供一些扩展特性,比如支持inline函数,支持内联汇编,分支声明。
关于分支声明,是用于条件选择语句的,gcc内建了一条指令用于优化条件选择,而内核把这条指令封装成了宏。例如:
if(likely(abc)) { //abc通常为真
/*...*/
}
或
if(unlikely(abc)) { //abc通常不为真
/*...*/
}
3. 缺乏像用户空间一样的保护机制
内核可以发现用户程序非法访问内存,但如果内核自己发生内存错误,就会导致OOPS。在内核中发生的非法内存访问是危险的。
4. 内核中的内存不分页
内核中的内存不进行分页,每用掉一个字节则意味着物理内存减少了一个字节。
5. 浮点数很难使用
内核对浮点数操作支持不好,在用户空间的进程内进行浮点操作时,内核会从整数操作模式向浮点数操作模式转换,但具体做什么则和体系结构相关。在内核中使用浮点数时,要人工保存和恢复浮点寄存器。
6. 内核只有一个很小的定长堆栈
x86可以在编译时配置,4KB or 8KB。2页大小的内存栈,32位机的内核栈是8KB,64位机的是64KB。
7. 由于内核支持异步中断、抢占和SMP,所以必须注意同步与并发问题。
8. 可移植性,注意字节序,64位对齐,不假定字长与页面长度。
阅读(1943) | 评论(0) | 转发(0) |