分类: 嵌入式
2016-05-30 17:45:19
一.Kexec介绍
在调试过程中,经常需要重启内核以还原现场,进而复现某些问题予以追踪解决。由于每一次的内核启动,都会伴随着一次的boot自检。但是,对于已经启动过的同一内核,重复的boot自检完全没有必要,且造成了资源浪费。此外,有时候我们需要使用一个小内核来启动一个大内核。在这两种需求下,kexec应运而生,kexec是一款可以让您重新启动到一个新 Linux 内核的快速重新引导功能部件,不再必须通过固件和引导装载程序阶段,从而跳过序列中最长的部分,大大减少了重启时间。对企业级系统而言,Kexec 大大减少了重启引起的系统宕机时间。对内核和系统软件开发者而言,Kexec 帮助您在开发和测试成果时可以迅速重新启动系统,而不必每次都要再经历耗时的固件阶段。
用新内核覆盖旧内核的工作分三个阶段完成:
1) 将新内核拷贝到内核中。
2) 将这个内核映像移到动态内核内存中。
3) 将这个映像拷贝到真正的目标位置(覆盖当前内核),然后启动新内核。
Kexec功能由用户态工具与内核态两部分实现。其实现的功能分别如下:
1. 用户态Kexec:用于加载并解析新内核,将解析结果作为参数传递给内核态Kexec;
2. 内核态Kexec:将用户态传递过来的数据进行封装,并用新内核数据覆盖当前内存中的内核数据,最后进行内核的跳转。
二.使用Kexec 工具切换内核条件
1.首先在内核配置时必须配置Kexec 支持,如下选项要选上
[*] kexec system call |
.2.下载kexec-tools源码进行编译生成kexec工具。
三.kexec使用方法
kexec的执行过程包括两个步骤
在当前被使用的内核下,将要使用的新内核载入到内存中
重新启动到之前预先载入的新内核
第一步:加载新内核
kexec -l /uImage --dtb=my.dtb --initrd=Initrd --append=\"root=/dev/ram rw loglevel=7 console=ttyS0,115200 pci=realloc=on bigphysarea=1024 mem=8128M
第二步:载入完成之后”切换”到新内核
kexec -e
注意:
Kexec 二次加载功能只支持uImage 格式的内核进行二次加载;