kexec是怎么跳过bios直接启动第二个内核的

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 指令入口

实现“无硬件复位启动第二个内核”。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值