二、从内核出发

1、何处安装并触及源码

  内核源码一般安装在/usr/src/linux目录下。不要把这个源码树用于开发,因为编译你的c库所用的内核版本就链接到这棵树。不要以root的身份对内核进行修改,而应当是建立自己的主目录,仅以root身份安装新内核。即使在安装新内核时,/usr/src/linux目录都应当原封不动。

2.1.3 使用补丁

  patch -pl <../patch-x.y.z

2.2 内核源码树

2.3 编译内核

2.3.1 配置内核

1、make config

2、make gconfig

3、make dconfig

4、make oldconfig

2.3.2 减少编译的垃圾信息

make >../detritus

make>/dev/null

2.3.3 衍生多个编译作业

make -jn n指衍生出的作业数

2.3.4 安装新内核

  在使用grub的x86系统上,可能需要把arch/i386/boot/bzImage拷贝到/boot目录下,像vmlinuz-version这样命名,并且编辑grub.conf文件,为内核建立一个新的启动项

  以root身份运行make modules_install就可以把所有已编译的模块安装到正确的主目录/lib/modules下

2.4 内核开发的特点

  1、既不能访问c库又不能访问标准的c头文件

  2、必须使用GNU C

  3、缺乏内存保护机制

  4、难以执行浮点数运算

  5、内核给每个进程只有一个很小的定长堆栈

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

  7、要考虑移植的重要性

2.4.1

  对内核来说,完整的C库——哪怕是他的一个子集,都太大且太低效了。

  printk函数用法很像printf,printk允许制定一个标志来设置优先级。例如printk(KERN_ERR "this si an error!\n");

2.4.2 GNU C

  1、内联函数

  定义一个内联函数时,需要static关键字,并且用inline限定它如:static inline void wolf(unsigned long tail_size)

  内联函数优点:可以消除函数调用和返回所带来的开销(寄存器存储和恢复);由于编译器会把调用函数的代码和函数本身放在一起优化,所以也有进一步优化的可能。

      缺点:代码会变长,意味着占用更多的内存空间或者占用更多的指令缓存。

  2、内联汇编

  我们通常用asm()指令嵌入汇编代码。

  unsigned int low,hign;

  asm volatile("rdtsc":"=a"(low),"=d"(high));/**low 和high分别包含64位时间戳的低高32位

  3、分支声明

  likely(),unlikely()

 

posted @ 2013-04-01 23:37  shuying1234  阅读(169)  评论(0编辑  收藏  举报