Linux做为一个开源的内核,其源代码也能够用git下载和管理html
- 获取最新提交到版本树的一个副本 - $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git - 下载代码后,更新本身的分支到最新分支 - $ git pull
$ tar xvjf linux-x.y.z.tar.bz2
压缩形式为zip:$ tar xvzf linux-x.y.z.tar.gz
linux
关于参数: -x 解开.tar格式的文件 -v 显示详细信息 -j 使用bzip2程序 -z 使用gzip程序 -f 使用归档文件
从内部源码树开始,运行$ patch -p1 < ../patch-x,y,z
git
详见LINUX内核分析第三周学习总结:构造一个简单的LINUX系统MENUOS中第一部分:“Linux内核源码简介”。安全
目 录 | 描 述 |
---|---|
arch | 特定体系结构的代码 |
block | 块设备I/O层 |
crypo | 加密API |
Documentation | 内核源码文档 |
drivers | 设备驱动程序 |
firmware | 使用某些驱动程序而须要的设备固件 |
fs | VFS和各类文件系统 |
include | 内核头文件 |
init | 内核引导和初始化 |
ipc | 进程间通讯代码 |
kernel | 像调度程序这样的核心子系统 |
lib | 一样内核函数 |
mm | 内存管理子系统和VM |
net | 网络子系统 |
samples | 示例,示范代码 |
scripts | 编译内核所用的脚本 |
security | Linux 安全模块 |
sound | 语音子系统 |
usr | 早期用户空间代码(所谓的initramfs) |
tools | 在Linux开发中有用的工具 |
virt | 虚拟化基础结构 |
make config
)和配置用户界面(例如:make menuconfig
:基于ncurse库的图形界面工具;make gconfig
:基于gtk+的图形工具...)。/boot
目录下的配置文件写进.config
文件中,采用的是注释的形式写进新增长的功能。CONFIG_IKCONFIG_PROC
会把完整的压缩过的内核配置文件存放在/proc/config.gz
中,再次编译时能够方便地克隆当前的配置。减小垃圾信息网络
$ make > ../detritus #将错误报告和警告信息重定向到文件中 $ make > /dev/null #将无用的输出信息重定向到/dev/null中 - /dev/null:空设备,输入的信息直接丢弃
衍生多个编译做业:make程序能把编译过程拆分红多个并行的做业。其中每一个做业独立并发地运行,有助于加快多处理器系统上的编译过程,也有利于改善处理器的利用率。默认状况下,make只衍生一个做业。并发
$ make -jn #以多个做业编译内核 - j:指定同时执行多任务 - n:要衍生出的做业数
make modules_install #把全部已编译的模块安装到正确的主目录/lib/modules下
符号对照表
。用来将内核符号与它们的起始地址对应起来。include
中arch/<architecture>/include/asm
目录下什么是GNU?GNU是一种操做系统,GNU提供的C编译器就是咱们以前使用的gcc。
static inline void wolf(unsigned long tail_size); - static:关键字 - inline:用于限定关键字
定义内联函数特色:时间要求高,自己长度较短的函数。异步
使用以前就要定义好内联函数,通常在头文件中定义。分布式
为了类型安全和易读性,优先使用内联函数而不是复杂的宏。函数
unsigned int low, high; asm volatile("rdtsc" : "=a" (low), "=d" (high)); /* low 和 high 分别包含64位时间戳的低32位和高32位 */ - asm:嵌入汇编代码 - volatile:不优化
/* 若是error在绝大多数状况下为0(假) */ if (unlikely(error)) { /* ... */ } /* 若是success在绝大多数状况下不为0(真) */ if (likely(success)) { /* ... */ }
参考资料1:《Linux内核设计与实现》(原书第三版)
参考资料2:make config 解惑工具