linux 内核源码

Image
Image
Image
Image

Linux 内核源码是一个非常大的 C 语言工程(少量汇编、Rust 等),核心负责管理 CPU、内存、设备、进程、网络、文件系统、安全等。

官方源码:
Linux Kernel Source Code

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 这条线路读,而不是从驱动开始。

类似文章