一、源码树顶层目录结构
解压后的源码目录(如linux-6.6.1/),顶层主要目录如下:
linux-6.6.1/
├── arch/
├── block/
├── certs/
├── crypto/
├── Documentation/
├── drivers/
├── fs/
├── include/
├── init/
├── ipc/
├── kernel/
├── lib/
├── mm/
├── net/
├── samples/
├── scripts/
├── security/
├── sound/
├── tools/
├── usr/
├── virt/
├── MAINTAINERS
├── Makefile
├── Kconfig
├── README
└── ...
二、主要目录说明
| 目录 | 说明 |
|---|---|
| arch/ | 架构相关代码(如x86、arm等,每种CPU架构一个子目录) |
| block/ | 块设备层(如磁盘调度、块设备驱动) |
| certs/ | 证书相关(如模块签名) |
| crypto/ | 加密算法实现(如AES、SHA等) |
| Documentation/ | 内核文档(开发、配置、API说明等) |
| drivers/ | 驱动程序(如网络、USB、PCI、显卡等,按功能分类) |
| fs/ | 文件系统实现(如ext4、xfs、fat、proc、sysfs等) |
| include/ | 头文件(public接口、内核API、结构体定义等) |
| init/ | 内核初始化代码(启动流程入口) |
| ipc/ | 进程间通信(如信号量、消息队列、共享内存) |
| kernel/ | 内核核心代码(如调度、fork、syscall、信号等) |
| lib/ | 常用库函数(如字符串、位操作、压缩等) |
| mm/ | 内存管理(如页表、分配器、swap等) |
| net/ | 网络协议栈(如TCP/IP、UDP、802.11、socket等) |
| samples/ | 示例代码(如驱动、内核模块demo) |
| scripts/ | 编译、配置相关脚本 |
| security/ | 安全模块(如SELinux、AppArmor等) |
| sound/ | 声卡和音频相关驱动 |
| tools/ | 用户空间工具(如perf、cpupower等) |
| usr/ | 早期用户空间支持代码(如initramfs) |
| virt/ | 虚拟化相关(如KVM、Xen等) |
| MAINTAINERS | 各个模块维护者名单及联系方式 |
| Makefile | 顶层make编译脚本 |
| Kconfig | 配置选项入口文件 |
| README | 简要说明文件 |
三、常见子目录举例
1. arch/
arch/x86/:x86架构相关代码arch/arm/:ARM架构相关代码arch/mips/:MIPS架构相关代码- 每个架构下有启动流程、汇编、平台支持、架构特有驱动等
2. drivers/
drivers/net/:网络设备驱动drivers/usb/:USB设备驱动drivers/gpu/:显卡驱动drivers/block/:块设备驱动drivers/input/:输入设备驱动drivers/char/:字符设备驱动
3. fs/
fs/ext4/:ext4文件系统代码fs/nfs/:NFS文件系统代码fs/proc/:proc伪文件系统fs/cifs/:CIFS/SMB网络文件系统
4. include/
include/linux/:内核通用头文件include/asm-generic/:通用汇编相关头文件include/uapi/:用户空间API头文件
四、常见文件说明
- Makefile:编译入口,定义编译规则
- Kconfig:内核配置项入口
- README:源码树说明
- MAINTAINERS:维护者列表
- .config:用户自定义配置(编译后生成)
五、源码树浏览建议
- 用
tree -L 2命令快速查看目录结构(需安装tree工具) - 用
grep -r "关键字" .快速查找源码 - 用
cscope、ctags等工具辅助源码阅读
六、源码树结构图示(简化版)
linux/
├── arch/ # 架构相关
├── drivers/ # 驱动
├── fs/ # 文件系统
├── include/ # 头文件
├── kernel/ # 核心
├── mm/ # 内存管理
├── net/ # 网络
├── security/ # 安全
├── sound/ # 音频
├── tools/ # 工具
├── ...
七、准备工作
-
安装依赖工具
- 常见依赖包括:
gcc、make、binutils、bison、flex、libncurses-dev、libssl-dev、bc等。 - Ubuntu/Debian 安装命令:
sudo apt update sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc
- 常见依赖包括:
-
获取内核源码
- 官方下载:https://git.kernel.org/
- 解压源码包:
tar -xf linux-5.x.y.tar.xz cd linux-5.x.y
八、配置内核
内核配置决定了编译出来的功能和模块。
1. 交互式配置工具
-
文本菜单界面(推荐):
make menuconfig依赖
libncurses,可选择/取消功能,保存为.config文件。 -
图形界面(需 X11):
make xconfig -
命令行配置(适合脚本化):
make config
2. 使用已有配置
- 复制当前系统配置(如
/boot/config-$(uname -r)):cp /boot/config-$(uname -r) .config make oldconfig
3. 精简内核
- 只选需要的功能和驱动,关闭不需要的选项,有助于减少编译时间和体积。
- 推荐关闭调试(debug)、不需要的文件系统、网络协议等。
九、减少编译垃圾信息
编译时信息太多会影响查错和阅读,可以用如下方法减少输出:
1. 使用 make 的静默模式
make -s
加 -s 参数,减少 make 输出。
2. 使用 V=0 参数(默认)
make V=0
这是内核编译的默认安静模式,只输出简要信息。
3. 只看错误和警告
结合 grep 过滤:
make -j8 2>&1 | grep -E "error|warning"
4. 详细模式(调试用)
如果需要详细信息:
make V=1
十、并发编译(多核加速)
现代 CPU 通常有多核,可以并行编译提升速度。
1. 使用 -j 参数
如有 8 核,推荐:
make -j8
可用 nproc 自动获取 CPU 核心数:
make -j$(nproc)
2. 并发编译注意事项
- 不要设置过高,建议
-j数值不超过物理核心数的 1.5 倍。 - 内存不足时并发过高可能导致卡顿甚至失败。
十一、常用编译目标
- 编译内核镜像:
make -j$(nproc) - 编译模块:
make modules -j$(nproc) - 安装模块:
sudo make modules_install - 安装内核(镜像、System.map、配置等):
sudo make install
十二、编译结果文件说明
arch/x86/boot/bzImage:主流 x86 架构的内核镜像System.map:符号表.config:配置文件vmlinuz-*:安装后生成的内核文件
十三、常见问题与技巧
-
清理编译中间文件
make clean # 清理大部分中间文件 make mrproper # 清理更彻底,包括 .config -
查看编译进度
- 使用
make -j$(nproc) | tee build.log,编译日志保存在 build.log。
- 使用
-
只编译特定模块
make drivers/net/ethernet/intel/e1000e.ko
十四、总结流程示例
# 1. 获取并解压源码
tar -xf linux-6.x.y.tar.xz
cd linux-6.x.y
# 2. 配置内核
make menuconfig # 或复制已有配置并 oldconfig
# 3. 编译内核(静默、并发)
make -j$(nproc) V=0
# 4. 编译并安装模块
sudo make modules_install
# 5. 安装内核
sudo make install
创作不易,点赞关注,持续更新!!!

4154

被折叠的 条评论
为什么被折叠?



