linux 内核源码
Linux 内核源码是一个非常大的 C 语言工程(少量汇编、Rust 等),核心负责管理 CPU、内存、设备、进程、网络、文件系统、安全等。
GitHub 镜像:
Linux Kernel GitHub Mirror
1. Linux 内核源码目录结构
下载源码后:
linux/
├── arch/ CPU架构相关
├── block/ 块设备层
├── certs/ 证书
├── crypto/ 加密算法
├── drivers/ 设备驱动
├── fs/ 文件系统
├── include/ 头文件
├── init/ 内核启动
├── ipc/ 进程通信
├── kernel/ 核心代码
├── lib/ 通用库
├── mm/ 内存管理
├── net/ 网络协议栈
├── samples/ 示例
├── scripts/ 编译脚本
├── security/ 安全模块
├── sound/ 音频
├── tools/ 工具
├── virt/ 虚拟化
├── Makefile
└── Kconfig
2. Linux 启动流程源码
从 CPU 上电开始:
CPU Reset
|
v
BIOS/UEFI
|
v
Bootloader
(grub)
|
v
arch/x86/boot/
|
v
startup_32()
startup_64()
|
v
start_kernel()
|
v
rest_init()
|
v
用户空间 init
关键文件:
arch/x86/boot/
负责:
- 实模式启动
- 加载内核
核心入口:
init/main.c
里面:
asmlinkage __init void start_kernel(void)
{
setup_arch();
mm_init();
sched_init();
rest_init();
}
这是 Linux 内核 C 代码真正开始的位置。
3. 进程管理源码
目录:
kernel/
核心文件:
kernel/fork.c
创建进程:
SYSCALL_DEFINE0(fork)
{
return kernel_clone(...);
}
进程结构:
include/linux/sched.h
核心:
struct task_struct
{
pid_t pid;
volatile long state;
struct mm_struct *mm;
struct files_struct *files;
struct thread_struct thread;
};
Linux 每个线程就是一个:
task_struct
4. 调度器源码
目录:
kernel/sched/
主要:
core.c
fair.c
rt.c
deadline.c
CFS 调度:
kernel/sched/fair.c
核心函数:
pick_next_task_fair()
负责:
选择下一个运行线程
流程:
时钟中断
|
v
scheduler_tick()
|
v
检查时间片
|
v
pick_next_task()
|
v
switch_to()
5. 内存管理源码
目录:
mm/
重要文件:
| 文件 | 作用 |
|---|---|
| page_alloc.c | 物理页分配 |
| slab.c | 内核对象缓存 |
| vmalloc.c | 虚拟地址 |
| memory.c | 内存管理 |
| mmap.c | 用户空间映射 |
核心结构:
进程
|
v
mm_struct
|
v
页表
|
v
物理内存
虚拟地址:
0x7fffffff
用户空间
----------------
0xffffffff
内核空间
6. 系统调用源码
目录:
arch/x86/entry/
用户:
write(fd,buf,size);
进入:
syscall
|
v
entry_SYSCALL_64
|
v
do_syscall_64()
|
v
sys_write()
系统调用表:
arch/x86/entry/syscalls/syscall_64.tbl
例如:
1 common write sys_write
7. 文件系统源码
目录:
fs/
例如 ext4:
fs/ext4/
VFS:
fs/namei.c
fs/open.c
结构:
应用程序
open()
|
v
VFS
|
+----ext4
|
+----xfs
|
+----btrfs
|
v
磁盘驱动
8. 网络协议源码
目录:
net/
TCP:
net/ipv4/tcp.c
net/ipv4/tcp_input.c
流程:
socket()
|
v
TCP
|
v
IP
|
v
网卡驱动
|
v
硬件
9. 设备驱动源码
目录:
drivers/
例如:
网卡:
drivers/net/
USB:
drivers/usb/
显卡:
drivers/gpu/
Linux 驱动模型:
设备
|
device
|
driver
|
bus
|
kernel
10. 推荐学习路线(从零)
结合你之前学习 CPU、触发器、时序控制,建议:
第一阶段:启动
源码:
arch/x86/boot
init/main.c
目标:
理解:
CPU
↓
汇编
↓
C入口
↓
start_kernel()
第二阶段:系统调用
学习:
用户程序
↓
syscall
↓
内核函数
源码:
arch/x86/entry
kernel/sys.c
第三阶段:进程
源码:
kernel/fork.c
kernel/sched/
include/linux/sched.h
理解:
线程
进程
上下文切换
寄存器保存
第四阶段:内存
源码:
mm/
理解:
虚拟地址
页表
TLB
物理页
第五阶段:驱动
源码:
drivers/
写:
- 字符设备驱动
- PCI驱动
- USB驱动
11. 如果想真正读懂 Linux 内核
推荐顺序:
CPU原理
↓
汇编
↓
C语言
↓
boot启动
↓
中断
↓
系统调用
↓
进程调度
↓
内存管理
↓
文件系统
↓
网络
↓
驱动
你之前在研究 CPU内部线路、触发器、时序控制、多核启动,实际上正好对应 Linux 内核最底层部分:
硬件
|
CPU流水线
|
中断控制器
|
arch/x86
|
Linux kernel
|
用户程序
如果目标是深入源码,建议从 arch/x86/boot → init/main.c → kernel/sched → mm 这条线路读,而不是从驱动开始。