linux源码结构

By Zing - 2014-11-16

0x01 两三句话

online资料虽然多,但是找到自己想要的并非那么容易。

暂时想到的一条了解linux kernel的思路

  • linux 源码的结构
  • linux 各部分基础了解,比如file system
  • 简单文件系统实现
  • 简单内存管理实现
  • 内核编译
  • 调试准备
  • linux漏洞源码分析

获取linux源码的途径

  • 官网 https://www.kernel.org/
  • github https://github.com/torvalds/linux
  • git到本地 ,当然也可以git Linus的

    git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
    cd linux
    git checkout 版本号
  • ubuntu的话,可以这样

    apt-get source linux-image-$(uname -r)

0x02 linux源码结构

在linux创始人Linus Torvalds的github上可以找到linux的tree结构

地址 https://github.com/torvalds/linux

0x03 根目录下的文件介绍

编译文件,配置文件以及声明文件都放在根目录下,这些类型的文件在其他项目中也时常看到

COPYING

关于专利和版权的问题,linux内核采用了GPLv2

CREDITS

贡献者

Kbuild

内核编译的一个配置脚本,比如支持什么样arch处理器

Kconfig

内核配置脚本

MAINTAINERS

维护者们的一些信息,如果你发现了漏洞可以和相应模块的维护者联系

Makefile

编译内核主要文件,它会向编译器传递参数,比如需要编译的文件

README

告诉你编译内核的步骤

REPORTING-BUGS

报告错误的帮助文件

0x04 根目录下的代码文件夹

实现linux系统各个功能的代码文件夹列表

arch
block
crypto
Documentation
drivers
firmware
fs
include
init
ipc
kernel
lib
mm
net
samples
scripts
security
sound
tools
usr
virt

arch

arch文件夹中也包含一个Kconfig文件,也用于源码编译,每种支持的处理器架构都有相应的文件夹,比如x86架构的源代码就在x86文件中

block

包含块设备驱动程序源码

crypto

包含众多加密算法的源码,比如md5

Documentation

如果想要寻找内核以及其他文件的信息,可以来这里看看

drivers

驱动源码

firmware

让电脑可以从设备读懂设备信号

fs

包含了所有需要理解和使用的文件系统源码,每种文件系统都有自己的文件,比如ext4文件系统的文件夹。
fs文件夹中还有一些文件用于处理整个文件系统。比如mount.h文件包含了处理挂载文件系统的代码。

include

包含较杂的内核使用头文件,文件名字来源于c语言的中include

init

包含了处理内核启动的代码,main.c文件是内核的核心,和其他其他文件有重要联系

ipc

IPC代表进程内部通信,ipc文件夹内包含的代码用于处理内核进程通信层。

kernel

kernel文件夹内的代码用于控制内核自身。比如一个调试器需要跟踪一个bug,那么内核会执行这个文件夹中的代码来告诉调试器这个过程中内核的动作,方便调试器了解信息。kernel文件夹中还有用于跟踪时间,让电脑重启、关机或者睡眠等代码。

lib

lib文件夹包含内核库文件,随时提供给kernel调用。

mm

Memory Management的缩写,用于内存管理。

net

包含了有关网络协议的代码,比如用于以太网,wifi,蓝牙的代码。也包含了处理网桥和DNS解析的代码。

samples

里面包含一些编程实例和模块。

scripts

包含了编译需要的一些脚本,最好不要改变里面的内容,可能会造成内核编译出错

security

维护内核安全的代码

sound

音频驱动代码

tools

包含影响内核的工具

usr

在内核编译完成之后创建vmlinuz等文件

virt

虚拟化,允许使用者运行不同的操作系统,与Xen不同的是,宾客系统就像一个应用程序一样运行在linxu操作系统最上层。而Xen是让两个操作系统共同管理硬件,互不依赖。

From Z1ng'Blog