linux kexec 介绍

kexec的功能是用一个运行的内核去运行一个新内核,就像运行一个应用程序一样。这种机制因为跳过了bootloader,可以实现系统的快速重启。另外kdump也是基于kexec实现(示意如下)。

kexec的实现有几点难点:

  1. 在当前内核的上下文中,如何用新内核去替换现有内核?
  2. 正常复位启动过程中,设备会被复位(或初始化)到已知状态。跳过了复位阶段,那如何在新内核kexec启动时,保证设备状态的可靠?

kexec的使用示例如下,其分为2部分:kexec内核加载和kexec内核执行。

    kexec -l /bzImage --initrd=/initrd.img.gz --append="ro nosmap loglevel=4 console=ttyS0,9600n8 acpi_rsdp=0x7b7fe014"
kexec -e

kexec 内核加载

  1. 将内核镜像文件、根文件系统、命令行参数等segment加载到用户态内存;
  2. 对segment sha256检查,确保内核数据没有被破坏;如果是kdump,备份相关数据到备份区(如i386,最开始的640K配置数据用于SMP内核启动,需要备份;或者powerpc,固定位置的异常向量等信息需要备份等)。这个环节又叫purgatory,其流程可以在用户态控制实现,也可以在内核态控制实现(如使能--kexec-file-syscall选项);
  3. 分配内核态页面,并将segment从用户态内存copy到内核态页面;如果使能--kexec-file-syscall选项,则跳过前面两步,直接将segment加载到内核页面,并进行purgatory。
  4. 分配页面并初始化image->control_code_page,对其建立页表,为下一步进行覆盖当前内核时代码寻址的页表映射。初始化LEVEL4/3/2/1 4层页表,并建立映射关系(如下图所示)。

kexec 内核运行

  1. 调用设备驱动shutdown接口关闭设备;
  2. 关闭中断,如IO-APIC, local irq, LAPIC;
  3. 关闭非0号CPU核;
  4. 清空TLB(此处以下代码为汇编实现,具体实现与arch相关,一般名叫relocate_new_kernel);
  5. 设置段寄存器、gdt、idt等;
  6. 建立一个新栈,并将新内核的入口地址压入栈中;
  7. 设置cr0寄存器:使能分页功能和页面保护功能;
  8. 设置cr4寄存器:使能扩展地址;
  9. 设置cr3寄存器,使cr3指向新的页表根目录;设置后,从此就与旧内核bye bye了;
  10. 将内核segment页面copy到指定位置,覆盖当前内核;
  11. 调用ret指令,从栈中弹出之前压栈的新内核bzImage入口地址,进入新内核引导;

kexec 调试注意事项

  1. kexec不会同步或卸载文件系统,此过程需要用户来保证;
  2. 从上面的流程中可以看出,kexec不会对cpu或设备进行复位,但系统重启过程中会调用reboot_notifier_list,所以register_reboot_notifier注册的接口不要有执行CPU复位等操作;
  3. 为了保证设备在kexec时处于稳定状态,kexec会调用设备驱动的shutdown接口来关闭,确保用户自己的设备驱动提供了正确的shutdown接口,或用户通过其他方式进行关闭;

--EOF--

linux kexec内核引导的更多相关文章

  1. Linux 内核引导选项简介

    Linux 内核引导选项简介 作者:金步国 连接地址:http://www.jinbuguo.com/kernel/boot_parameters.html 参考参数:https://www.cnbl ...

  2. 非常好!!!Linux源代码阅读——内核引导【转】

    Linux源代码阅读——内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...

  3. Linux 内核引导参数简介

    概述 内核引导参数大体上可以分为两类:一类与设备无关.另一类与设备有关.与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数.比如,如果你想知道可以向 AHA ...

  4. 羽夏看Linux内核——引导启动(上)

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  5. 深入linux kernel内核配置选项

    ============================================================================== 深入linux kernel内核配置选项 ...

  6. mkimage的-a 和 –c参数和内核引导

    目录 一.mkimage工具简介二.-a参数与-e参数和内核引导的关系三.实例测试 3.1 -a参数与-e参数相同,可以将内核下载到SDRAM的任何地址,然后从这启动 3.2 -a参数与-e参数不同, ...

  7. Linux常用内核参数

    Linux常用内核参数 TCP状态描述 CLOSED:无连接是活动的或正在进行的 LISTEN:服务器在等待进入呼叫 SYN-RECV:一个连接请求已经到达,等待确认 SYN-SENT:应用已经开始, ...

  8. The Kernel Boot Process.内核引导过程

    原文标题:The Kernel Boot Process 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译一下.一来自己 ...

  9. Linux升级内核总结

    Linux内核升级总结. 一.编译内核步骤 1.#uname –r 确定系统的原内核版本,然后下载较新版本的Linux内核源码包 http://www.kernel.org/pub/linux/ker ...

随机推荐

  1. CodeForces - 796B 模拟

    思路:模拟移动即可,如果球落入洞中停止移动.注意:有可能第一个位置就是洞!! AC代码 #include <cstdio> #include <cmath> #include ...

  2. python 下载新的模块

    首先, 进入到python的安装目录 在安装目录下有一个Scripts文件夹. 然后里面有一个pip.exe 文件, 这个文件就是执行安装包的. 执行: pip.exe install django ...

  3. Android开发之Android Context Menu

    1 Creatinga上下文菜单, Todefine上下文菜单的外观和行为,推翻youractivity的上下文菜单回滚方法,onCreateContextMenu()和onContextItemSe ...

  4. 基于嵌入式操作系统VxWorks的多任务并发程序设计(2) ――任务控制

    4 任务与任务状态 VxWorks实时内核Wind提供了基本的多任务环境.对用户而言,宏观上看起来,多个任务同时在执行.而本质而言,在微观上,系统内核中的任务调度器总是在根据特定的调度策略让它们交替运 ...

  5. freemarker自定义标签报错(一)

    freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Token manager error: freemarker.core.TokenMgr ...

  6. Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around

    1.错误描述 INFO:2015-05-01 11:12:15[localhost-startStop-1] - Root WebApplicationContext: initialization ...

  7. Duplicate entry '97112' for key 1

    1.错误描述 2014-07-08 10:27:13,939 ERROR(com.you.conn.JDBCConnection:104) -com.mysql.jdbc.exceptions.jdb ...

  8. Python与Memcached交互

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  9. Python Web-第五周-Web Services and XML(Using Python to Access Web Data)

    1.Web Service Overview 1.Data on the Web Python Dictionary 和 Java HashMap间需要建立一个桥梁,可以用XML或是JSON 2.XM ...

  10. [BZOJ4736]温暖会指引我们前行

    BZOJ(BZOJ上的是什么鬼...) UOJ 任务描述 虽然小R住的宿舍楼早已来了暖气,但是由于某些原因,宿舍楼中的某些窗户仍然开着(例如厕所的窗户),这就使得宿舍楼中有一些路上的温度还是很低. 小 ...