linux 5.15.107 内核源码 目录介绍及作用

    linux-5.15.107 源码下载链接:https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.107.tar.gz

下载解压后如下图:

目录名 主要作用
arch 存放体系结构相关的代码 (如 x86, ARM, MIPS 等)
block 块设备层代码,I/O 调度
certs 内核模块签名和验证的证书和密钥
crypto 内核加密框架和加密算法实现
Documentation 内核官方文档
drivers 各种设备驱动程序 (如网络、显卡、USB、PCI 等)
fs 虚拟文件系统 (VFS) 和各种具体文件系统 (如 Ext4, XFS, procfs)
include 内核头文件,定义数据结构、宏和函数原型
init 内核初始化和启动代码
ipc 进程间通信 (IPC) 机制实现 (如 System V IPC, POSIX IPC)
kernel 内核核心代码 (进程管理、调度、时间、信号、锁机制等)
lib 内核通用库函数和辅助例程 (字符串操作、CRC、压缩等)
mm 内存管理子系统 (页分配、slab 分配器、虚拟内存、交换等)
net 内核网络协议栈实现 (TCP/IP, socket, Netfilter 等)
samples 演示内核特性或 API 用法的示例代码
scripts 内核编译、配置、维护和开发的脚本和工具
security Linux 安全模块 (LSM) 框架和安全模型实现 (如 SELinux, AppArmor)
sound 声音子系统 (ALSA 核心和声卡驱动)
tools 内核开发和调试相关的用户空间工具 (如 perf, bpftool)
usr 主要用于生成 initramfs 的相关支持
virt 虚拟化技术相关的代码 (如 KVM, Xen 客户机支持, Virtio)
  1. arch:
    • 作用: 存放体系结构相关的代码。我们知道 Linux 是一个支持多种处理器架构的操作系统,例如 x86 (i386, x86_64), ARM (arm, arm64), MIPS, PowerPC, RISC-V, s390 等。此目录下的每一个子目录都对应一种或一类特定的 CPU 架构。
    • 内容: 包含了特定架构的引导代码、内存管理实现、中断处理、CPU 特性相关的代码、系统调用实现细节以及特定于该架构的驱动程序等。例如,arch/x86 包含了针对 Intel 和 AMD 等 x86 架构处理器的代码,而 arch/arm64 则包含了针对 64 位 ARM 架构的代码。
  2. block:
    • 作用: 包含块设备层的代码。块设备是指以固定大小的数据块(block)进行数据读写的设备,如硬盘、固态硬盘 (SSD)、U 盘等。
    • 内容: 实现了块设备的请求队列、I/O 调度算法(例如 CFQ, Deadline, NOOP)、块设备驱动的通用接口和辅助函数等。它为文件系统和底层块设备驱动之间提供了一个抽象层。
  3. certs:
    • 作用: 存放用于内核模块签名和验证的证书和密钥相关的代码。
    • 内容: 包含了在内核编译时用于签署内核模块的 X.509 证书和私钥。当启用了模块签名验证功能时,内核会使用这些证书来验证加载的模块是否可信,以增强系统安全性。
  4. crypto:
    • 作用: 内核加密框架的所在地。它为内核的其他部分(如 IPsec 网络、dm-crypt 块设备加密、文件系统加密等)提供加密算法和 API。
    • 内容: 实现了各种对称加密算法 (如 AES, DES)、哈希算法 (如 SHA1, MD5)、公钥加密算法、随机数生成器以及相关的 API 接口。它允许硬件加密加速器的集成。
  5. Documentation:
    • 作用: 包含内核的官方文档。这是理解内核各个子系统、API、配置选项、开发流程等的重要参考资料。
    • 内容: 文档以 reStructuredText (RST) 格式编写,涵盖了内核的方方面面,包括内核参数、特定驱动程序的说明、内核内部机制的解释、如何为内核贡献代码等。可以使用 Sphinx 等工具将其编译成 HTML 或 PDF 等易于阅读的格式。
  6. drivers:
    • 作用: 这是内核源代码中最大的目录之一,包含了所有设备驱动程序的代码。驱动程序是内核与硬件设备之间沟通的桥梁。
    • 内容: 按照设备类型进行了分类,例如:
      • char/: 字符设备驱动 (如串口、终端)。
      • block/: (此目录下的 drivers/block 存放具体的块设备驱动,而顶层的 block 目录是块设备层核心代码)。
      • net/: 网络设备驱动 (如有线网卡、无线网卡)。
      • gpu/: 图形处理器 (GPU) 驱动。
      • hid/: 人机接口设备 (HID) 驱动 (如键盘、鼠标)。
      • i2c/, spi/, usb/, pci/: 各种总线驱动和连接到这些总线的设备驱动。
      • staging/: 一些尚未完全成熟或正在开发中的驱动程序,等待合并到更稳定的位置。
  7. fs:
    • 作用: 包含了虚拟文件系统 (VFS) 的实现以及各种具体文件系统的代码。VFS 是一个抽象层,使得用户程序可以用统一的方式与不同类型的文件系统进行交互。
    • 内容: VFS 核心代码 (如 inode.c, file.c, dcache.c 等) 和各种文件系统实现 (如 Ext4, XFS, Btrfs, NTFS, FAT, procfs, sysfs 等)。每个文件系统都在此目录下有其对应的子目录。
  8. include:
    • 作用: 包含内核的头文件。这些头文件定义了内核使用的数据结构、宏、函数原型等。
    • 内容:
      • include/linux/: 大部分内核通用的头文件。
      • include/uapi/: (User API) 暴露给用户空间的头文件,定义了内核与用户空间程序交互的接口 (如系统调用号、ioctl 命令等)。
      • include/asm-generic/: 通用的汇编相关头文件。
      • 特定架构的头文件会通过 arch/<architecture>/include/asm 链接或包含进来。
  9. init:
    • 作用: 包含内核的初始化和启动代码。
    • 内容: main.c 文件是内核启动的起点 (在架构相关的引导代码之后),负责初始化内核的各个子系统,如调度器、内存管理、VFS 等。还包括 do_mounts.c (挂载根文件系统) 等。
  10. ipc:
    • 作用: 包含进程间通信 (Inter-Process Communication, IPC) 机制的实现。
    • 内容: 实现了 System V IPC (如消息队列、信号量、共享内存) 和 POSIX IPC (如 POSIX 消息队列) 的内核部分。
  11. kernel:
    • 作用: 包含内核的核心代码,主要涉及进程管理、调度、时间管理、信号处理、内核同步机制等。
    • 内容:
      • sched/: 进程调度器代码。
      • time/: 时间管理、定时器相关的代码。
      • signal.c: 信号处理。
      • fork.c: 进程创建 (fork, clone)。
      • locking/: 内核锁机制 (如自旋锁、互斥锁)。
      • printk.c: 内核打印函数 printk 的实现。
      • trace/: 内核跟踪和事件记录 (如 ftrace)。
  12. lib:
    • 作用: 包含内核使用的一些通用库函数和辅助例程。
    • 内容: 实现了字符串操作 (如 strcpy, strlen)、位操作、CRC校验、压缩/解压缩算法 (如 zlib, lzo)、排序算法等。这些函数被内核的其他部分广泛调用,以避免代码重复。也包含了 kobject.cklist.c 等内核对象管理相关的代码。
  13. mm:
    • 作用: 内存管理 (Memory Management) 子系统的代码。负责管理系统的物理内存和虚拟内存。
    • 内容: 包括页分配器 (buddy system)、slab/slub/slob 分配器 (用于小对象的分配)、虚拟内存管理 (如页表管理、缺页中断处理)、交换 (swap) 机制、内存映射 (mmap) 等。
  14. net:
    • 作用: 包含内核网络协议栈的实现。
    • 内容: 实现了各种网络协议,如 TCP/IP (IPv4, IPv6)、UDP、ICMP、ARP 等。还包括套接字 (socket) 层、网络过滤 (Netfilter/iptables)、路由、网络调度等。各个协议族 (如 ipv4/, ipv6/, bluetooth/) 都有其对应的子目录。
  15. samples:
    • 作用: 包含一些示例代码,用于演示如何使用内核的某些特性或 API。
    • 内容: 提供了一些简单的内核模块、BPF 程序示例、kprobes 示例等,帮助开发者学习和测试内核功能。
  16. scripts:
    • 作用: 包含用于内核编译、配置、维护和开发的各种脚本和工具。
    • 内容:
      • Kbuild/Kconfig 系统相关的脚本,用于管理内核的配置和编译过程。
      • Makefile 片段。
      • 代码检查工具 (如 checkpatch.pl)。
      • setlocalversion 用于生成内核版本字符串。
      • dtc/ (Device Tree Compiler) 设备树编译器源码。
      • package/ 用于创建内核包的脚本。
  17. security:
    • 作用: 包含 Linux 安全模块 (Linux Security Modules, LSM) 框架以及各种安全模型的实现。
    • 内容: LSM 框架允许插入不同的安全策略模块,如 SELinux, AppArmor, Smack, TOMOYO Linux。此目录包含了这些模块的代码以及内核的通用安全功能,如能力 (capabilities) 系统。
  18. sound:
    • 作用: 包含内核的声音子系统,即 ALSA (Advanced Linux Sound Architecture) 和早期的 OSS (Open Sound System) 的部分兼容代码。
    • 内容: ALSA 核心代码、声卡驱动的通用框架以及针对各种声卡芯片的驱动程序。
  19. tools:
    • 作用: 包含一些与内核开发和调试相关的用户空间工具。这些工具通常需要与特定内核版本一起编译和使用。
    • 内容:
      • perf/: perf性能分析工具的源码。
      • hv/: Hyper-V 主机和客户端相关的工具。
      • power/: 电源管理相关的工具,如 turbostat
      • bpf/: BPF (Berkeley Packet Filter) 相关的工具,如 bpftool
      • testing/: 内核测试相关的工具和框架。
  20. usr:
    • 作用: 主要用于生成 initramfs (初始 RAM 文件系统) 的相关支持。
    • 内容: 包含了一个早期的用户空间环境,用于在真正的根文件系统被挂载之前执行一些初始化任务。gen_init_cpio.c 用于从一个描述文件生成 cpio 归档的 initramfs。
  21. virt:
    • 作用: 包含与虚拟化技术相关的代码,主要是针对内核作为宿主机 (Host) 或客户机 (Guest) 运行时的支持。
    • 内容:
      • KVM (Kernel-based Virtual Machine) 的核心代码和特定架构的实现。
      • Xen 客户机支持。
      • Virtio 驱动的框架和实现 (一些 Virtio 驱动也分布在 drivers/ 目录下)

内核相关的网站:

  1. https://www.kernel.org/ 内核的官方源头和分发中心
  2. https://docs.kernel.org/ 官方权威文档的查阅地
  3. https://kernelnewbies.org/ 新手入门和了解版本变化的窗口
  4. https://bugzilla.kernel.org/ 官方的缺陷报告和追踪平台
  5. https://elixir.bootlin.com/linux/ 源码在线阅读和分析工具

本文版权归原作者zhaofujian所有,采用 CC BY-NC-ND 4.0 协议进行许可,转载请注明出处。

发表评论