说明:之所有选择3.0.1内核版本源码,是因为其相对于2.6.24及后续2.6版本比较新,而相对于最新的内核版本源码(4.16)也不算太古老。Linux内核以稳定闻名,因而选择中间3.0第一个版本进行分析,后续内核代码更新也与此版本差异不大,读者可以基于此目录分析自行查阅。
.gitignore
git的版本管理文件。我们都知道Linux内核源码托管在github中,此文件告诉git进行版本管理时哪些文件不需要添加到版本管理中,哪些文件需要添加到版本管理中。这里补充git的过滤与包含规则:
过滤:
*.elf #表示进行版本管理时过滤掉所有.elf文件
包含:
!.gitignore #表示进行版本管理时包含. gitignore文件(以感叹号开头)
有关kernel源码版本管理的规则,大家可以自行阅读此文件。
.mailmap
邮箱地址映射文件,将一些比较“混乱”的kernel作者名映射到具体的邮件地址,具体文件内容如下所示:
Aaron Durbin
Adam Oldham
Adam Radford
COPYING
kernel源码版权申明文件。
CREDITS
kernel源码捐赠者名单,按照N(name)、E(email)、W(web-address)、P(PGP key IDand fingerprint、D(description)、S(snail-mail address)建立目录项,方便使用grep或其他脚本进行处理;
Kbuild
内核顶层编译文件,具体做如下三件事:
→ 产生bounds.h头文件;
→ 产生asm_offset.s.h头文件;
→ 检测当前架构缺少的系统调用。
Kconfig
内核源码顶层配置文件,编译内核源码时用到,用于搜索各个子目录下的Kconfig文件;
MAINTAINERS
内核维护人员名单以及指导如何提交内核代码;
Makefile
内核顶层编译makefile文件。
README-----最重要
关于Linux内核的介绍,包括如何编译、安装内核以及出错后的解决方案;
REPORTING-BUGS
指导如何报告内核BUG。
arch
内核源码中与处理器架构相关的代码。如不同的处理器架构(x86、mips、powerpc)有不同的boot引导方式(原理大致相同,细节有些差异);
block
块设备驱动程序I/O调度;
crypto
常用加解密和散列算法(如AES,SHA等),还有一些压缩和CRC校验算法。
Documentation---------重要,有关内核源码介绍第一手资料
内核源码介绍性的文档以及少量的测试代码。
drivers
内核源码中所有设备驱动程序,由于基于Linux开发的设备形态很多,此部分代码占据内核源码的绝大部分。
firmware
固件代码。一般不用(4.14源码中此目录已没有任何代码),介绍如下:
Thatrepository contains all these firmware images which have been extracted fromolder drivers, as well various new firmware images which we were neverpermitted to include in a GPL'd work, but which we _have_ been permitted toredistribute under separate cover.
意思是说:此目录包含所有那些从老的驱动代码中提取出来的固件映像和没被GPL授权的固件映像,但是它们被许可在独立的目录中发布。
fs
文件系统代码,如ntfs、ext2、ext3等。大家或许了解,Linux内核通过VFS(virtualfile systems)隐藏各个具体文件的系统的细节,此目录即包含各个具体文件系统的代码。
include
Linux内核公共头文件存放的位置。
init
内核启动入口代码-----start_kernel等。设备从上电 → boot-loader引导 → 内核加载与解压之后就到达此处;
ipc
Linux内核支持的各种进程间通信(IPC,Inter-Process communication)源码,典型的有System V和Posix两种进程间通信方式。
kernel
kernel就是内核,内核中最核心的部分,包括进程的调度(sched.c)、进程PID管理(pid.c)、cgroups、进程的创建和撤销(fork.c和exit.c)等;
lib
内核标准的算法与数据结构库,如双向链表、红黑树(rbtree.c)、位图(bitmap.c)等;
mm
内核内存管理(memory management)子系统源码。
net
内核网络协议栈代码,包含各种协议类型,如unix域、tcp/udp、ethernet等;
samples
内核调试的一些例子,如KDB、tracepoint等;
scripts
一些实用的脚本,如之前所述的Kbuild文件就会调用此目录下的checksyscalls.sh脚本进行系统调用检查;
security
内核与安全相关的代码,对计算机免于受到病毒和黑客的侵害很重要;
sound
ALSA、OSS等音频设备的驱动核心代码;
tools
一些实用的测试工具程序,如测试USB、电源控制等。
usr
用于压缩和打包的CPIO程序。
virt
此文件夹包含了内核虚拟化代码,如KVM(Kernel-basedVirtual Machine),它允许用户一次运行多个操作系统。通过虚拟化,客户机操作系统就像任何其他运行在Linux主机的应用程序一样运行。