- 编译内核:
- 在编译内核之前,必须配置它;
- 配置的选项以CONFIG_FEATURE形式表示,如对称多处理器(SMP)的配置选项为:CONFIG_SMP=y/n;y表示启用,n表示不起作用;
- make config:该工具会挨个遍历所有配置项,要求用户选择yes,no或是module;
- make menuconfig:基于X11的图形工具;
- make xconfig:基于gtk+图形工具;
- make gconfig:
- make defconfig:创建一个默认配置;
- 配置文件存放在代码树根目录的.config文件中,可以直接修改或用它来配置新的代码树,此时需要验证和更新配置:make oldconfig;
- 配置好后,就可以用make命令来编译它了;
- 编译时,会在内核代码树的根目录下创建一个System.map文件;这是一份符号对照表,用以将内核符号和它们的起始地址对应起来。调试的时候,如果把内存地址翻译成容易理解的函数名以及变量名会很有用;
- 安装内核:
- 如何安装和体系结构以及启动引导工具有关;如在使用grub的x86的系统上,把arch/i386/boot/bzImage拷贝到/boot目录下,使用vmlinuz-version来命令它,并编译/boot/grub/grub.cfg文件(ubuntu 10.04),为新内核建立一个新的启动项;
- 内核开发的特点:
- 内核编程时不能访问C库:主要原因是速度和大小的问题;不过,大部分常用的C库函数在内核中都已经得到了实现;如操作字符串的函数组就位于lib/string.c文件中,只要包含<linux/string.h>头文件,就可以使用它们;
- 内核编程时必须使用GNU C:内核开发者总是要用到gcc提供的许多语言扩展部分(gcc是多种GNU编译器的集合,它包含了的C编译器即可以编译内核,也可以编译Linux系统上用C写的其他代码);最让人感兴趣的C语言扩展是:
- 内联函数:GNU的C编译器支持内联函数;在内核中,为了类型安全的原因,优先使用内联函数而不是宏;
- 内联汇编:gcc编译器支持在C函数中嵌入汇编语句;
- 分支声明:对于条件选择语句,gcc内建了一条指令用于优化;在一个条件经常出现或只有很少才会出现时,编译器可以根据这条指令对分支条件进行优化;内核把这条指令封装成宏:如likely()和unlikely();
- 没有内存保护机制:在内核中,不应该去做内存非法的地址访问,引用空指针等,否则内核会死掉;另外,内核中内存都不分页;
- 不要轻易在内核中使用浮点数:
- 容积小而固定的栈;
- 考虑同步和并发;
- Linux是抢占多任务操作系统:内核的进程调度程序对进程进行调度,内核必须对这些任务同步;
- Linux内核支持多处理器系统:多个处理器运行的代码很可能会同时访问共享的同一个资源;
- 中断是异常的,因此中断处理程序有可能访问同一资源;
- Linux内核可以被抢占,因此几段代码可能同时访问相同的资源;
- 可移植性的重要性;
kernel-3 从内核出发
最新推荐文章于 2023-10-05 23:58:16 发布