Linux内核学习——源代码
@
Linux 内核源码版本:6.6LTS
一个基于Linux内核的操作系统,一般应该包含以下部分:
- bootloader,比如GRUB和SYSLINUX,它负责将内核加载进内存,系统上电或者BIOS初始化完成后执行。
- init程序,负责启动系统的服务和操作系统的核心程序。
- 必要的软件库(比如加载elf文件的ld-linux.so),支持C程序的库(如GNU C Library,简称glibc),Android的Bionic。
- 必要的命令和工具,比如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设备驱动

浙公网安备 33010602011771号