Linux内核学习——源代码

@

Linux 内核源码版本:6.6LTS

一个基于Linux内核的操作系统,一般应该包含以下部分:

  1. bootloader,比如GRUB和SYSLINUX,它负责将内核加载进内存,系统上电或者BIOS初始化完成后执行。
  2. init程序,负责启动系统的服务和操作系统的核心程序。
  3. 必要的软件库(比如加载elf文件的ld-linux.so),支持C程序的库(如GNU C Library,简称glibc),Android的Bionic。
  4. 必要的命令和工具,比如shell命令和GNU coreutils等。

目录结构

├── linux-6.6
│   ├── arch
│   ├── block
│   ├── certs
│   ├── compile_commands.json
│   ├── COPYING
│   ├── CREDITS
│   ├── crypto
│   ├── Documentation
│   ├── drivers
│   ├── fs
│   ├── include
│   ├── init
│   ├── io_uring
│   ├── ipc
│   ├── Kbuild
│   ├── Kconfig
│   ├── kernel
│   ├── lib
│   ├── LICENSES
│   ├── MAINTAINERS
│   ├── Makefile
│   ├── mm
│   ├── Module.symvers
│   ├── net
│   ├── README
│   ├── rust
│   ├── samples
│   ├── scripts
│   ├── security
│   ├── sound
│   ├── tools
│   ├── usr
│   └── virt

  • Doucmentation目录,存放说明文档,没有代码。内核中一些复杂或者专业的模块会有帮助文档,涉及他们的背景和总结等。
  • arch目录,arch是architecture的简称,包含了与体系结构相关的代码,下面的每一个子目录都表示内核支持的一种体系结构。系统中有些特性的实现与具体的体系结构相关,比如内存也表和进程上下文等,这部分代码基本都会存放在此,其他目录存放的代码多是共性的。
  • kernel目录,内核的核心部分,包含进程调度、中断处理和时钟等模块的核心代码,他们与体系结构相关的代码存放在arch/xxx/kernel下面。
  • drivers目录,设备驱动代码集中存放在此,体量庞大。
    • char/: 字符设备驱动
    • block/:块设备驱动(硬盘、SSD 等)
    • usb/:USB 设备驱动
    • net/:网络设备驱动(网卡)
    • gpu/:显卡驱动(如 AMD、Intel 显卡)
    • sound/:音频驱动
    • pci/:PCI 总线驱动(设备枚举、资源分配)
    • virt/:虚拟化技术支持
    • input/:输入设备管理
  • sound 音频子系统(补充 drivers/sound/,包含音频框架和 codec 驱动)
  • firmware 硬件固件(部分设备需要的二进制固件,如网卡、蓝牙芯片的固件)
  • mm目录,mm是memory management的缩写,包含内存管理相关的代码,这部分代码与体系结构无关,与体系结构有关的代码存放在arch/xxx/mm下。
  • fs目录,包含文件系统的代码,涉及文件系统架构(VFS)和系统支持的各种文件系统,一个子目录对应至少一种文件系统,比如proc子目录对应proc文件系统。
  • net 网络子系统(TCP/IP 协议栈、网络接口、 socket 实现等)
    • ipv4/:IPv4 协议栈(如 tcp.c、udp.c、icmp.c)
    • ipv6/:IPv6 协议栈
    • socket.c:socket 核心实现
    • wireless/:无线网卡协议(如 Wi-Fi、蓝牙)
  • ipc目录,包含了消息队列、共享内存和信号量等进程间通信方式的实现。
  • security 安全子系统(SELinux、AppArmor、 capabilities 等安全机制)
  • block目录,包含块设备管理的代码,块设备与字符设备对应,前者支持随机访问,SD 卡和硬盘都是块设备,后者只支持顺序访问,键盘和串口等都是字符设备。
  • lib目录,包含公有的函数库,比如红黑树和字符串操作等。这里的库和用户空间的glibc并没有关系,glibc是封装内核的系统调用实现的,所以我们在内核中编程不能使用他们,应该使用的是内核提供的库。
  • include目录,全局头文件(所有模块共用的头文件,按功能分类),与架构相关的汇编和定义头文件则位于asm-*/目录下
  • tools 内核开发辅助工具(用户空间工具,非内核运行代码)
    • perf/:性能分析工具(perf 命令的源码)
    • bpf/:BPF 工具(动态跟踪、网络过滤)
    • objtool/:内核目标文件分析工具
  • scripts 编译构建脚本(内核编译时依赖的脚本,如配置脚本、链接脚本)
  • samples 内核编程规范,提供各种内核模块和驱动的实例代码
  • crypto 加密解密算法(如 AES、SHA、RSA 等内核层实现,供驱动、网络等模块使用)
  • init 内核初始化代码(内核启动流程的入口,如 main.c 中的 start_kernel())
  • usr initramfs 相关(内核启动时的临时根文件系统,用于加载驱动和挂载真实根目录)

阅读顺序

定位内核入口

  • init/main.c
void start_kernel(void)

内核启动的c语言函数,整个操作系统的起点

整体流程

顺着start_kernel的调用链,依次了解中断、内存、调度等子系统的初始化流程,建立整体概念。

阅读文档

Doucmentation下面有各个子系统的文档,可以增加对子系统的理解

阅读简单驱动

比如char设备驱动

参考

Linux内核笔记
lxr
elixir

posted @ 2025-10-14 22:59  main_c  阅读(1)  评论(0)    收藏  举报  来源