Linux内核实现 02_从内核出发
1. 内核源码树
| 目录 | 描述 |
|---|---|
| arch | 特定体系结构的源码 |
| block | 块设备I/O层 |
| crypto | 加密API |
| Documentation | 内核源码文档 |
| drivers | 设备驱动程序 |
| firmware | 使用某些驱动程序而需要的设备固件 |
| fs | VFS和各种文件系统 |
| include | 内核头文件 |
| init | 内核引导和初始化 |
| ipc | 进程间通信代码 |
| kernel | 像调度程序这样的核心子系统 |
| lib | 通用内核函数 |
| mm | 内存管理所用的脚本 |
| security | linux安全模块 |
| sound | yu语音子系统 |
| net | 网络子系统 |
| samples | 示例,示范代码 |
| scripts | 编译内核所使用的脚本 |
| usr | 早期用户空间代码(所谓的initamfs) |
| tools | 在linux开发中有用的工具 |
| virt | 虚拟化基础结构 |
2. 配置内核
$ make config
3. 消除编译信息
$ make > /dev/null
可把无用的输出信息重定向到永无返回值的黑洞/dev/null。
4.利用多核处理器编译
为了可以多个作业编译内核,使用以下命令:
$ make -jn
这里,n是要衍生出来的作业数。在实际中,每个处理器一般衍生出一个或者两个作业。例如:在一个16核处理器上,你可以输入如下命令:
$make -j32 > /dev/null
利用出色的distcc或者ccache工具,也可以动态的改善内核的编译时间。
5.安装内核
$ make module_install
就可以把所有已编译模块安装到正确的目录/lib/modules 下。想利用内核做自己的产品,就需要重新编写内核的makefile,分开用户态和内核态,注意内核态与用户态的通信。
6. 内核开发的特点
最重要的差异包括以下几种:
- 内核编程时既不能访问c库也不能访问标准的c头文件。
- 内核编程时必须使用GUN C。
- 内核编程时缺乏向用户空间那样的内存保护机制。
- 内核编程时难以执行浮点运算。
- 内核给每个进程只有一很小的定长堆栈。
- 由于内核支持异步中断、抢占和smp(对称多处理),因此必须时刻注意同步与并发。
- 要考虑可移植性的重要性。
Linux内核混用了C语言和汇编语言。在偏近体系的底层或对执行时间要求严格的地方,一般使用的是汇编语言。而内核其他的大部分代码是用c语言编写的。
-
分支声明
对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候。编译器可以根据这条指令对条件分支选择进行优化。内核把这条指令封装成了宏,比如likely(),和unlikely()。例如:
if (error) { /*..............*/ } 如果想要把一个分支标记为通常为假的选择:
/* 我们认为error绝大部分时间都会为0...*/ if(unlikely(error)){ /*..........*/ } 相反,如果我们想把一个分支标记为真的选择:
/*我们认为succuss通常不会为0 */ if(likely(success)) { /*.......*/ }
本文来自博客园,作者:{心亘久},转载请注明原文链接:https://www.cnblogs.com/zhaodejin/p/16219289.html

浙公网安备 33010602011771号