kexec 是怎么“跳过 BIOS”直接启动第二个内核的
它本质上是:
不经过硬件复位,直接在当前内存里“切换内核”。
1、传统启动流程(对比一下)
正常重启是这样的:
reboot
↓
CPU 硬件复位
↓
BIOS/UEFI
↓
GRUB
↓
加载新内核
这个过程:
会重新初始化硬件
会重新跑固件
时间比较慢
内存会被清空
2、kexec 的核心思想
kexec 的核心就是一句话:
“我已经在内存里了,为什么还要回 BIOS?”
它的做法是:
1️⃣ 在当前系统还活着时
2️⃣ 直接把“第二个内核”加载进内存
3️⃣ 保存好跳转入口
4️⃣ 发生 panic 时直接跳过去执行
整个过程:
不经过 BIOS
不经过 GRUB
不清空内存
3、kexec 工作分两步
第一步:预加载第二个内核
系统正常运行时执行:
kexec -p /boot/vmlinuz-xxx \
--initrd=/boot/initramfs-kdump.img \
--append="root=..."
这一步做了什么?
👉 把小内核加载到 crashkernel 预留区
👉 记录入口地址
👉 做好内存映射
但 并不会启动它。
它只是“躺在那等着”。
第二步:panic 时跳转
当内核 panic:
panic()
内部会调用:
crash_kexec()
这个函数会:
1️⃣ 关闭中断
2️⃣ 停止其他 CPU
3️⃣ 切换页表
4️⃣ 跳转到小内核入口地址
本质上类似:
jump_to_new_kernel(entry_point);
就像函数跳转一样。
4、为什么能跳过去?
因为 CPU 其实不关心“你是不是内核”。
它只知道:
给我一个内存地址,我从那里开始执行指令。
所以:
BIOS 本质也是跳转
GRUB 本质也是跳转
kexec 也是跳转
只是:
👉 BIOS 是从 0xffff0 开始
👉 GRUB 跳到内核入口
👉 kexec 直接跳到另一个内核入口
5、关键:内存为什么没被清掉?
因为:
kexec 不触发硬件复位。
它只是:
软件级跳转
不重置 RAM
不清空内存
所以:
原内核的内存内容还在
这就是为什么:
小内核还能读取原内核内存,生成 vmcore。
6、那硬件状态怎么办?
这里是技术难点。
kexec 会:
关中断
重置 APIC
让其他 CPU 停下来
重新建立页表
重新初始化最基本的 CPU 状态
但不会:
重新跑 BIOS
重新初始化所有硬件
小内核会自己重新初始化驱动。
7、用一个比喻
传统重启:
把整台机器断电再开机
kexec:
不断电,直接换大脑
8、在 crashkernel 场景下更特别
普通 kexec(软重启):
kexec -l
kexec -e
是主动切换内核。
而 kdump 场景:
kexec -p
是:
预加载,等 panic 自动跳转。
9、核心总结一句话
kexec 之所以能跳过 BIOS,是因为:
它本质是一个“内存级别的函数跳转”,而不是硬件重启。
它利用:
预留内存
预加载内核
直接修改 CPU 指令入口
实现“无硬件复位启动第二个内核”。

3万+

被折叠的 条评论
为什么被折叠?



