Linux 内核

🧭《深入理解 Linux 内核(2.6.11)》 → Linux 6.x 源码结构对照与学习导引 #


🧩 一、系统整体结构 #

模块书中章节Linux 2.6 路径Linux 6.x 路径说明
内核入口(启动流程)第 2 章arch/i386/kernel/head.S, init/main.carch/x86/kernel/head_64.S, init/main.c入口逻辑相似:仍是 start_kernel(),但支持多架构(x86, ARM, RISC-V)
系统调用入口第 10 章arch/i386/kernel/entry.S, arch/i386/kernel/traps.carch/x86/entry/entry_64.S, kernel/syscall_table.S系统调用表机制相同,但入口汇编和 syscall wrapper 重写
内核初始化流程第 3 章init/main.cinit/main.c主干逻辑仍是 start_kernel() → rest_init()

🧠 二、进程与调度(Process & Scheduler) #

模块书中章节2.6.11 路径6.x 路径说明
进程描述符第 3–4 章include/linux/sched.h, kernel/fork.cinclude/linux/sched.h, kernel/fork.ctask_struct 结构仍然存在,字段大幅扩展(多 CPU、NUMA 支持)
进程创建第 3 章kernel/fork.ckernel/fork.c核心函数仍是 do_fork() / copy_process()
进程终止第 3 章kernel/exit.ckernel/exit.c逻辑基本相同
调度器第 7 章kernel/sched.c(O(1) 调度器)kernel/sched/core.c, kernel/sched/fair.c(CFS 调度器)📌 最大差异:现代内核使用 CFS(完全公平调度器)取代了 O(1)
睡眠与唤醒第 7 章kernel/sched.ckernel/sched/core.c同样通过 wait_queue 与 schedule()

🧮 三、内存管理(Memory Management) #

模块书中章节2.6.11 路径6.x 路径说明
页框分配第 8 章mm/page_alloc.cmm/page_alloc.c概念一致(buddy system),但支持 NUMA / CMA / ZONE_DEVICE
虚拟内存管理第 9 章mm/mmap.c, mm/mprotect.cmm/mmap.c, mm/mprotect.cvm_area_struct、mm_struct 概念仍相同
页面换出第 15 章mm/vmscan.cmm/vmscan.c逻辑相似但复杂度大幅提升
Slab 分配器第 8 章mm/slab.cmm/slub.c, mm/slab_common.c默认使用 SLUB(比 Slab 更简洁高效)

🧱 四、中断与异常(Interrupts & Exceptions) #

模块书中章节2.6.11 路径6.x 路径说明
中断描述第 4 章arch/i386/kernel/irq.c, kernel/irq/handle.ckernel/irq/ 下多文件(manage.c, chip.c, spurious.c 等)2.6 时是单文件,现在模块化程度更高
中断上下文切换第 4–5 章arch/i386/kernel/entry.Sarch/x86/entry/entry_64.S汇编层实现更新为 x86_64 调用约定
软中断、tasklet、工作队列第 4–5 章kernel/softirq.c, kernel/workqueue.ckernel/softirq.c, kernel/workqueue.c概念完全保留

💾 五、文件系统(VFS & FS) #

模块书中章节2.6.11 路径6.x 路径说明
虚拟文件系统层(VFS)第 12 章fs/namei.c, fs/open.c, fs/read_write.cfs/namei.c, fs/open.c, fs/read_write.c几乎同名路径,代码更复杂
inode / dentry 机制第 12 章fs/inode.c, fs/dcache.cfs/inode.c, fs/dcache.c概念完全相同,接口丰富
文件系统注册第 13 章fs/super.cfs/super.c仍然是 register_filesystem()
Ext2 文件系统第 14 章fs/ext2/fs/ext4/现代系统几乎都使用 ext4 取代 ext2

🔌 六、设备驱动与内核模块(Driver & Module) #

模块书中章节2.6.11 路径6.x 路径说明
模块加载机制第 20 章kernel/module.ckernel/module/(目录化)模块系统大改:支持 LTO、压缩、Rust 模块等
设备驱动模型第 13 章drivers/base/drivers/base/书中介绍的 kobject/kset/driver model 仍是基础
字符设备第 13 章drivers/char/drivers/char/仍可用同样机制注册字符设备

⚙️ 七、同步机制(Synchronization) #

模块书中章节2.6.11 路径6.x 路径说明
自旋锁、信号量第 5 章kernel/spinlock.c, kernel/semaphore.ckernel/locking/完全独立成 kernel/locking/ 模块
RCU(Read-Copy-Update)第 5 章初步存在kernel/rcu/现代内核的核心机制之一
原子操作第 5 章include/asm/atomic.hinclude/linux/atomic/已高度泛化并支持多架构实现

🌐 八、网络子系统(Networking) #

模块书中章节2.6.11 路径6.x 路径说明
网络协议栈第 18–19 章net/ipv4/, net/core/net/ipv4/, net/core/, net/ipv6/路径相同,但功能极大增强(XDP、eBPF)
Socket 实现第 18 章net/socket.cnet/socket.c接口一致,内部实现复杂化
eBPFkernel/bpf/, tools/bpf/⚡ 新增:现代 Linux 内核的重大特性

🧩 九、核心入口函数速览(Linux 6.x 仍保留的经典符号) #

功能函数名路径
内核启动start_kernel()init/main.c
系统调用sys_* 系列kernel/sys_*.c
进程调度schedule()kernel/sched/core.c
创建进程do_fork(), copy_process()kernel/fork.c
虚拟内存管理do_mmap(), do_munmap()mm/mmap.c
文件打开do_sys_openat2()fs/open.c
读写文件vfs_read(), vfs_write()fs/read_write.c

🧭 十、推荐的现代学习路线图(结合你的环境) #

阶段内容对应实践
阶段 1:结构导览通读 ULK 前 3 章 + 对照 init/, kernel/, arch/x86/阅读 init/main.c 中的 start_kernel()
阶段 2:进程调度与内存对照书中第 3–9 章阅读 kernel/sched/ 与 mm/page_alloc.c
阶段 3:VFS 与系统调用书中第 10–14 章对照 fs/ 与 arch/x86/entry/
阶段 4:同步与驱动模型书中第 5、20 章查看 kernel/locking/, drivers/base/
阶段 5:现代特性探索eBPF、io_uring、cgroups、namespaces阅读 kernel/bpf/, fs/io_uring.c, kernel/cgroup/

✅ 总结 #

  • 你完全可以用 Linux 6.x + OrbStack 学《深入理解 Linux 内核》。

  • 书中内容 = 原理清晰,但源码版本老;

  • 用上面表格对照即可快速定位现代源码路径;

  • 强烈推荐结合 LXR (Linux Cross Reference) 或 GitHub 搜索源码符号,例如:

    👉 https://elixir.bootlin.com/linux/latest/source


这份指南按章节、学习目标、现代源码入口函数排列,让你可以 边看书边看 Linux 6.x 源码,系统掌握内核整体结构。


🧭 Linux 内核学习路线图(基于 ULK 与 Linux 6.x) #

📘 阶段 1:从入口了解内核的全貌(第 1–3 章) #

学习目标对应书章节Linux 6.x 源码入口阅读建议
了解内核启动流程第 2 章《内核的初始化》init/main.c → start_kernel() → rest_init()重点看:内核初始化顺序、内核线程创建
了解体系结构特定代码第 2 章arch/x86/kernel/head_64.S, arch/x86/kernel/setup.c理解从汇编入口到 C 初始化的过渡
系统调用初始化第 10 章arch/x86/entry/entry_64.S, kernel/sys_ni.c现代系统调用表在 arch/x86/entry/syscalls/syscall_64.tbl

📍 建议阅读顺序:

1️⃣ arch/x86/kernel/head_64.S

2️⃣ start_kernel() → mm_init() / sched_init() / rest_init()

3️⃣ kernel_init() → init/main.c 结尾


🧠 阶段 2:进程管理与调度(第 3–7 章) #

学习目标书中章节Linux 6.x 入口函数路径
理解 task_struct第 3 章include/linux/sched.h所有进程核心结构
进程创建机制第 3 章copy_process()、do_fork()kernel/fork.c
进程退出流程第 3 章do_exit()、release_task()kernel/exit.c
调度器原理第 7 章schedule()、__schedule()、pick_next_task_fair()kernel/sched/core.c, kernel/sched/fair.c
睡眠/唤醒机制第 7 章__wake_up()、prepare_to_wait_event()kernel/sched/wait.c
内核线程第 3 章kernel_thread(), kthread_create()kernel/kthread.c

📍 建议阅读顺序:

1️⃣ 阅读 include/linux/sched.h → task_struct

2️⃣ 阅读 copy_process() 创建流程

3️⃣ 再看 schedule() 调度实现

4️⃣ 最后看 do_exit() 结束逻辑


🧮 阶段 3:内存管理(第 8–9 章) #

学习目标书中章节Linux 6.x 源码入口路径
页框分配(Buddy System)第 8 章alloc_pages()、__alloc_pages()mm/page_alloc.c
虚拟内存映射第 9 章do_mmap()、do_munmap()mm/mmap.c
内核内存分配(kmalloc)第 8 章kmalloc(), kmem_cache_alloc()mm/slub.c
页换出第 15 章shrink_node(), vmscan.cmm/vmscan.c

📍 建议阅读顺序:

1️⃣ alloc_pages() → 物理页分配

2️⃣ kmalloc() → 内核分配接口

3️⃣ do_mmap() → 用户空间映射

4️⃣ vmscan.c → 回收与换出机制


⚙️ 阶段 4:同步与中断(第 4–5 章) #

学习目标书中章节6.x 源码入口路径
中断处理框架第 4 章__do_softirq(), handle_irq_event()kernel/irq/
软中断 / tasklet / 工作队列第 4–5 章kernel/softirq.c, kernel/workqueue.c同路径
自旋锁与信号量第 5 章kernel/locking/spinlock.c, kernel/locking/mutex.c同路径
RCU 机制第 5 章rcu_read_lock(), synchronize_rcu()kernel/rcu/

📍 建议阅读顺序:

1️⃣ kernel/irq/ → 中断注册与处理

2️⃣ softirq.c / workqueue.c → 异步任务机制

3️⃣ spinlock.c, mutex.c → 同步原语


💾 阶段 5:文件系统与 VFS(第 12–14 章) #

学习目标书中章节6.x 入口函数路径
系统调用层 → VFS第 12 章do_sys_openat2(), vfs_open()fs/open.c
inode/dentry第 12 章struct inode, d_lookup()fs/inode.c, fs/dcache.c
文件读写第 12 章vfs_read(), vfs_write()fs/read_write.c
文件系统注册第 13 章register_filesystem()fs/super.c

📍 建议阅读顺序:

1️⃣ 从 sys_open() → do_sys_openat2() 开始

2️⃣ 阅读 vfs_open()、inode_operations

3️⃣ 理解 read_write.c 的读写流程


🔌 阶段 6:设备驱动与模块(第 19–20 章) #

学习目标书中章节6.x 源码入口路径
模块加载与符号解析第 20 章load_module()、layout_and_allocate()kernel/module/main.c
字符设备注册第 13 章register_chrdev_region(), cdev_add()fs/char_dev.c
驱动模型第 13 章kobject, device_register()drivers/base/core.c

📍 建议阅读顺序:

1️⃣ 阅读 kernel/module/ → 模块装载

2️⃣ drivers/base/ → 驱动模型与 kobject

3️⃣ fs/char_dev.c → 字符设备注册


🌐 阶段 7:网络子系统(第 18–19 章) #

学习目标书中章节6.x 源码入口路径
socket 创建与绑定第 18 章sock_create_kern(), __sys_bind()net/socket.c
协议栈入口第 19 章tcp_v4_connect(), ip_queue_xmit()net/ipv4/tcp.c, net/ipv4/ip_output.c
网络接口第 19 章register_netdev()net/core/dev.c

📍 建议阅读顺序:

1️⃣ 从 net/socket.c → sock_create() → inet_create()

2️⃣ 进入 net/ipv4/tcp.c → tcp_v4_connect()

3️⃣ 理解 dev_queue_xmit() 与网卡驱动收发机制


🧩 阶段 8:现代新增机制(ULK 未涵盖) #

模块路径功能
eBPFkernel/bpf/, tools/bpf/可编程内核执行环境
io_uringfs/io_uring.c高性能异步 I/O
cgroup / namespacekernel/cgroup/, kernel/nsproxy.c容器化基础
Rust 模块支持rust/Linux 6.x 新增的安全驱动开发语言

📖 推荐阅读方式(高效三步法) #

1️⃣ 先看 ULK 理论章节(原理不变,重点理解抽象层次)

2️⃣ 再查表定位现代源码文件(上表提供路径)

3️⃣ 用符号搜索辅助阅读:

  • Elixir Bootlin

  • 搜索函数名,如 copy_process, do_fork, schedule

  • 跟踪调用栈和关键结构体定义


✅ 总结 #

  • 《深入理解 Linux 内核》仍是理解现代内核结构的最佳原理书

  • Linux 6.x 仅在实现层面演进(CFS、NUMA、RCU、SLUB 等),主干架构一致。

  • 按上述路线,你可以从“内核启动 → 调度 → 内存 → 文件系统 → 网络”完整走一遍。

  • OrbStack + Linux 6.x 源码 完全足够深入理解 Linux。


是否希望我接下来帮你生成一个 “函数调用导图 + 推荐阅读顺序(按调用栈)”,比如从 start_kernel() 开始一路展开,直到调度器初始化?

那样你能看到每一章具体调用链(像一张学习路线图)。

非常好 ✅

我们来正式构建一份可操作的、贯穿《深入理解 Linux 内核》的

🧭 函数调用导图 + 阅读顺序(基于 Linux 6.x 内核)

这份图从 内核入口函数 start_kernel() 出发,层层展开,直至调度器与内存初始化,是学习内核最关键的主干路径。

我会为每一层提供:

  • ✅ 主要函数名(函数入口)

  • 📂 对应源码路径

  • 🎯 学习目标(理解点)

  • 🧩 建议阅读顺序


🧩 Linux 6.x 内核启动主路径导图 #

(从汇编到内核线程)

arch/x86/kernel/head_64.S
        ↓
start_kernel()
        ↓
    setup_arch()
    mm_init()
    sched_init()
    rest_init()
        ↓
        ├─ kernel_init()  → init进程(PID 1)
        └─ kthreadd()     → 内核线程守护进程(PID 2)

🧱 第一阶段:体系结构入口(汇编 → C) #

阶段函数文件路径说明
🧩 1_startarch/x86/kernel/head_64.SCPU 上电后的第一个入口,建立最小运行环境
🧩 2x86_64_start_kernelarch/x86/kernel/head64.c从汇编跳入 C 世界,准备调用 start_kernel()
🧩 3start_kernel()init/main.cLinux 内核的 主入口函数

🎯 目标:

理解“汇编初始化 → 内核主控逻辑”的转换。

📍 你可以从 head_64.S 搜索 _start: 开始看,一直跳转到 start_kernel()。


⚙️ 第二阶段:内核初始化主流程( #

start_kernel() #

#

asmlinkage __visible void __init start_kernel(void)
{
    setup_arch(&command_line);
    setup_command_line();
    setup_per_cpu_areas();
    mm_init();
    sched_init();
    rest_init();
}
函数路径学习点
setup_arch()arch/x86/kernel/setup.c检测 CPU、内存布局、初始化分页
mm_init()mm/init.c启动内存管理系统(buddy、slab、vm)
sched_init()kernel/sched/core.c初始化调度器与 runqueue
rest_init()init/main.c启动第一个进程(kernel_init)与 kthread 守护线程

🎯 阅读建议顺序:

1️⃣ start_kernel() 总体

2️⃣ setup_arch() → CPU 检测 + 内存布局

3️⃣ mm_init() → 内存系统

4️⃣ sched_init() → 调度初始化

5️⃣ rest_init() → 创建内核线程


🧠 第三阶段: #

mm_init() #

 内存管理初始化 #

函数路径学习点
mm_init()mm/init.c初始化页表、内核堆、SLAB
mem_init()mm/mem_init.c建立物理内存管理结构
kmem_cache_init()mm/slab_common.c初始化 slab/slub 系统
vmalloc_init()mm/vmalloc.c虚拟内存分配机制

📍 推荐查看:

mm_init()
 ├─ page_ext_init_flatmem()
 ├─ kmem_cache_init()
 ├─ vmalloc_init()
 └─ mem_init()

🎯 目标:理解从物理内存 → 页管理 → 虚拟地址空间 的整个过程。


🧩 第四阶段: #

sched_init() #

 调度器初始化 #

函数文件学习点
sched_init()kernel/sched/core.c初始化全局调度器
init_sched_fair_class()kernel/sched/fair.c初始化 CFS 调度类
init_idle()kernel/sched/core.c初始化 idle 任务

📍 调用层次:

sched_init()
 ├─ init_sched_fair_class()
 ├─ init_idle()
 └─ init_rt_class()

🎯 目标:了解 CFS(完全公平调度器)的框架结构。


🧩 第五阶段: #

rest_init() #

 → 内核线程启动 #

static noinline void __ref rest_init(void)
{
    kernel_thread(kernel_init, NULL, CLONE_FS);
    pid = kernel_thread(kthreadd, NULL, CLONE_FS);
    init_idle();
    schedule();
}
函数路径说明
kernel_thread()kernel/fork.c创建内核线程
kernel_init()init/main.c初始化 init 进程(PID 1)
kthreadd()kernel/kthread.c内核线程守护进程(PID 2)

🎯 目标:理解 Linux 从单线程进入多任务状态的关键节点。


🔄 第六阶段: #

kernel_init() #

 → 用户空间切换 #

函数文件学习点
kernel_init()init/main.c加载驱动、挂载根文件系统
init_post()init/main.c执行 /sbin/init、/bin/sh 等用户进程
run_init_process()init/main.c第一个用户空间进程执行点

🎯 目标:

从这里,Linux 完成了“自举(bootstrapping)”的最后阶段,进入用户空间。


🧩 全调用关系图(核心路径) #

_start                  [arch/x86/kernel/head_64.S]
 └─ x86_64_start_kernel()
     └─ start_kernel()  [init/main.c]
         ├─ setup_arch()
         ├─ mm_init()
         │   ├─ kmem_cache_init()
         │   └─ mem_init()
         ├─ sched_init()
         │   └─ init_sched_fair_class()
         └─ rest_init()
             ├─ kernel_thread(kernel_init)
             │   ├─ do_basic_setup()
             │   ├─ driver_init()
             │   └─ run_init_process()
             └─ kernel_thread(kthreadd)

📚 推荐学习顺序(对照 ULK 章节) #

阶段ULK 章节现代源码入口学习重点
1️⃣ 启动阶段第 2 章init/main.c, arch/x86/kernel/head_64.S内核初始化框架
2️⃣ 内存管理第 8–9 章mm/init.c, mm/page_alloc.c物理页与虚拟内存
3️⃣ 调度器第 7 章kernel/sched/core.cCFS 调度机制
4️⃣ 进程创建第 3 章kernel/fork.ccopy_process() 流程
5️⃣ 系统调用第 10 章arch/x86/entry/syscalls/syscall_64.tblsyscall 表结构
6️⃣ 进程切换第 6 章__switch_to()任务上下文切换

💡 配合工具 #

工具用途
Elixir Bootlin在线浏览 Linux 源码,按函数跳转
cscope / ctags本地函数跳转索引
make ARCH=x86_64 tags生成源码索引
qemu-system-x86_64可在 macOS 上模拟原生启动调试内核

✅ 总结 #

  • 你的 OrbStack 内核版本(6.15.11)完全可以作为学习环境。

  • 按上述路径看 start_kernel() → rest_init() → kernel_init(),能贯穿整个内核生命周期。

  • 建议你在 Bootlin 上边看书、边展开对应函数,效果极佳。


是否希望我下一步帮你生成

🧩 “函数调用关系可视图(Mermaid 图格式)”

可直接在 Markdown / Obsidian / VSCode 中可视化?