Linux 内核编译

一、源码树顶层目录结构

解压后的源码目录(如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 "关键字" . 快速查找源码
  • 用 cscopectags 等工具辅助源码阅读

六、源码树结构图示(简化版)

linux/
├── arch/           # 架构相关
├── drivers/        # 驱动
├── fs/             # 文件系统
├── include/        # 头文件
├── kernel/         # 核心
├── mm/             # 内存管理
├── net/            # 网络
├── security/       # 安全
├── sound/          # 音频
├── tools/          # 工具
├── ...

七、准备工作

  1. 安装依赖工具

    • 常见依赖包括:gccmakebinutilsbisonflexlibncurses-devlibssl-devbc 等。
    • Ubuntu/Debian 安装命令:
      sudo apt update
      sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc
      
  2. 获取内核源码


八、配置内核

内核配置决定了编译出来的功能和模块。

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-*:安装后生成的内核文件

十三、常见问题与技巧

  1. 清理编译中间文件

    make clean      # 清理大部分中间文件
    make mrproper   # 清理更彻底,包括 .config
    
  2. 查看编译进度

    • 使用 make -j$(nproc) | tee build.log,编译日志保存在 build.log。
  3. 只编译特定模块

    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

 创作不易,点赞关注,持续更新!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值