关闭

第2章从内核出发

312人阅读 评论(0) 收藏 举报

内核开发的特点

 

内核编程时不能访问C库。

内核编程时必须使用GNU C。

内核编程时缺乏像用户空间那样的内存保护机制。

内核编程时浮点数很难使用。

内核只有一个很小的定长堆栈。

由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发。

要考虑可移植性的重要性。

 

 

GCC 特有的一些东西

 

内联(inline)函数

定义一个内联函数的时候,需要使用static作为关键字,并且用inline限定它。比如:

 

static inline void dog(unsigned long tail_size) 

内联函数必须在使用之前就定义好,否则编译器就没法把这个函数展开。实践中一般在头文件中定义内联函数。由于使用了static作为关键字进行限制,所以编译时不会为内联函数单独建立一个函数体。如果一个内联函数仅仅在某个源文件中使用,那么也可以把它定义在该文件开始的地方。

在内核中,为了类型安全的原因,优先使用内联函数而不是复杂的宏。

 

内联汇编

一般是在相应的体系结构里面用的,  ARM 混合 C 编程的时候这样用过.

C ARM汇编 混合编程

 

分支声明

就是把概率出现较小的分支用 宏 unlikely() 对 条件表达式定义下,应该就是物理内存尽可能不出现他.
例如,下面是一个条件选择语句:

if (foo) {  
        /* ... */  
} 
如果想要把这个选择标记成绝少发生的分支:

/* 我们认为foo绝大多数时间都会为0... */  
if (unlikely(foo)) {  
        /* ... */  
} 

相反,如果我们想把一个分支标记为通常为真的选择:

/* 我们认为foo通常都不会为0 */  
if (likely(foo)) {  
        /* ... */  
} 

没有内存保护机制

....

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类