内核启动流程分析与调试技巧
📚 共计 30 章节
第1章
内核启动入口分析
从BIOS/UEFI到GRUB,理解x86架构下内核的第一行代码执行前发生了什么。
BIOS
UEFI
GRUB
第2章
汇编启动阶段
head_64.S与startup_64,解析内核解压前的页表初始化与长模式切换。
head_64.S
长模式
页表
第3章
内核解压机制
vmlinuz与zImage的区别,解析自解压代码如何将内核镜像放到正确位置。
vmlinuz
zImage
自解压
第4章
start_kernel之前
分析decompress_kernel()后的控制权交接,进入C世界的入口点。
解压
C入口
交接
第5章
start_kernel函数全景
梳理内核初始化主函数的调用链,理解初始化顺序的依赖关系。
start_kernel
调用链
依赖
第6章
trap_init与中断门
早期中断向量表的建立,IDT的初始化过程与调试陷阱。
IDT
中断
陷阱
第7章
mm_init与内存管理起步
从memblock到伙伴系统,早期内存分配器的切换逻辑。
memblock
伙伴系统
内存
第8章
sched_init与调度器初始化
0号进程的诞生,调度器数据结构的早期准备。
0号进程
调度器
初始化
第9章
init_IRQ与中断控制器
APIC与IOAPIC的初始化,中断描述符表的建立。
APIC
IOAPIC
中断
第10章
time_init与时钟系统
系统时钟源的探测,jiffies与clocksource的初始化。
时钟源
jiffies
clocksource
第11章
console_init与早期打印
printk如何工作,early console的启用与调试技巧。
printk
early console
调试
第12章
vfs_caches_init与虚拟文件系统
VFS数据结构的初始化,根文件系统的挂载准备。
VFS
根文件系统
挂载
第13章
rest_init与1号进程
kernel_init线程的创建,用户空间init进程的启动流程。
kernel_init
1号进程
init
第14章
init进程的演变
从sysvinit到systemd,用户空间第一个进程的职责与调试。
sysvinit
systemd
用户空间
第15章
内核模块加载机制
module_init与initcall,内核模块的依赖解析与加载顺序。
module_init
initcall
依赖
第16章
设备驱动初始化
从platform bus到device tree,设备与驱动的匹配过程。
platform bus
device tree
驱动
第17章
设备树解析
DTB的传递与解析,of_*系列API在启动过程中的作用。
DTB
of_*
设备树
第18章
initrd与initramfs
临时根文件系统的作用,内核如何挂载并切换到真实根文件系统。
initrd
initramfs
根文件系统
第19章
内核启动参数详解
从quiet到initcall_debug,常用启动参数对调试的帮助。
启动参数
quiet
initcall_debug
第20章
printk与动态调试
pr_debug与dynamic_debug的使用,内核日志级别的控制。
pr_debug
dynamic_debug
日志
第21章
early_printk与硬件调试
在串口初始化前打印信息,JTAG与硬件断点的配合。
early_printk
JTAG
硬件断点
第22章
kdump与crash分析
内核崩溃转储机制的配置,使用crash工具分析vmcore。
kdump
crash
vmcore
第23章
ftrace与函数跟踪
动态跟踪内核函数调用,定位启动过程中的性能瓶颈。
ftrace
函数跟踪
性能
第24章
initcall_debug与启动耗时
测量每个初始化函数的执行时间,优化启动速度。
initcall_debug
耗时
优化
第25章
KGDB与内核源码调试
双机调试环境的搭建,在启动早期设置断点。
KGDB
双机调试
断点
第26章
启动日志分析
dmesg的时序解读,常见启动失败的错误码与含义。
dmesg
错误码
日志
第27章
常见启动故障排查
内核恐慌、死锁、驱动加载失败的实际案例分析。
内核恐慌
死锁
故障
第28章
UEFI与Secure Boot
安全启动对内核加载的影响,签名验证失败的调试方法。
UEFI
Secure Boot
签名
第29章
ARM64启动差异
与x86_64的对比,PSCI与FDT在ARM启动中的特殊处理。
ARM64
PSCI
FDT
第30章
启动性能优化实战
从测量到裁剪,减少内核大小与初始化时间的工程实践。
性能优化
裁剪
启动时间