linux kexec内核引导
linux kexec 介绍
kexec的功能是用一个运行的内核去运行一个新内核,就像运行一个应用程序一样。这种机制因为跳过了bootloader,可以实现系统的快速重启。另外kdump也是基于kexec实现(示意如下)。
kexec的实现有几点难点:
- 在当前内核的上下文中,如何用新内核去替换现有内核?
- 正常复位启动过程中,设备会被复位(或初始化)到已知状态。跳过了复位阶段,那如何在新内核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 内核加载
- 将内核镜像文件、根文件系统、命令行参数等segment加载到用户态内存;
- 对segment sha256检查,确保内核数据没有被破坏;如果是kdump,备份相关数据到备份区(如i386,最开始的640K配置数据用于SMP内核启动,需要备份;或者powerpc,固定位置的异常向量等信息需要备份等)。这个环节又叫purgatory,其流程可以在用户态控制实现,也可以在内核态控制实现(如使能--kexec-file-syscall选项);
- 分配内核态页面,并将segment从用户态内存copy到内核态页面;如果使能--kexec-file-syscall选项,则跳过前面两步,直接将segment加载到内核页面,并进行purgatory。
- 分配页面并初始化image->control_code_page,对其建立页表,为下一步进行覆盖当前内核时代码寻址的页表映射。初始化LEVEL4/3/2/1 4层页表,并建立映射关系(如下图所示)。
kexec 内核运行
- 调用设备驱动shutdown接口关闭设备;
- 关闭中断,如IO-APIC, local irq, LAPIC;
- 关闭非0号CPU核;
- 清空TLB(此处以下代码为汇编实现,具体实现与arch相关,一般名叫relocate_new_kernel);
- 设置段寄存器、gdt、idt等;
- 建立一个新栈,并将新内核的入口地址压入栈中;
- 设置cr0寄存器:使能分页功能和页面保护功能;
- 设置cr4寄存器:使能扩展地址;
- 设置cr3寄存器,使cr3指向新的页表根目录;设置后,从此就与旧内核bye bye了;
- 将内核segment页面copy到指定位置,覆盖当前内核;
- 调用ret指令,从栈中弹出之前压栈的新内核bzImage入口地址,进入新内核引导;
kexec 调试注意事项
- kexec不会同步或卸载文件系统,此过程需要用户来保证;
- 从上面的流程中可以看出,kexec不会对cpu或设备进行复位,但系统重启过程中会调用reboot_notifier_list,所以register_reboot_notifier注册的接口不要有执行CPU复位等操作;
- 为了保证设备在kexec时处于稳定状态,kexec会调用设备驱动的shutdown接口来关闭,确保用户自己的设备驱动提供了正确的shutdown接口,或用户通过其他方式进行关闭;
--EOF--
转载于:https://www.cnblogs.com/wahaha02/p/7152796.html
linux kexec内核引导相关推荐
- x86架构linux内核引导过程分析,Linux内核x86架构引导协议7(翻译)
运行内核 内核的跳转指令在相对于内核实模式部分为0x20的内存段处.也就是说,如果你把内核的实模式部分加载到了0x90000处,那么内核入口应该在0x9020:0000处. 在进入内核前,ds.es. ...
- Linux 内核引导选项简介 *********很多常用的受益匪浅
内核引导选项大体上可以分为两类:一类与设备无关.另一类与设备有关.与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项.比如,如果你想知道可以向 AHA154 ...
- Linux内核引导简析
bootsect.S.setup.S.head.S分析 收藏 2010-01-14 13:36:34 bootsect.S,系统引导程序,一般不超过512字节. 在PC系统结构中,线性地址0xA000 ...
- Linux内核引导选项
概述 内核引导选项大体上可以分为两类:一类与设备无关.另一类与设备有关.与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项.比如,如果你想知道可以向 AHA ...
- Linux 内核引导参数简介
概述 内核引导参数大体上可以分为两类:一类与设备无关.另一类与设备有关.与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数.比如,如果你想知道可以向 AHA ...
- 非常好!!!Linux源代码阅读——内核引导【转】
Linux源代码阅读--内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...
- Linux kernel内核编译配置选项详解
转载于:http://lamp.linux.gov.cn/Linux/kernel_options.html 作者:金步国 Code maturity level options 代码成熟度选项 Pr ...
- 【realtime】红帽 RedHat Linux实时内核配置要点全面分析
CentOS Linux实时性配置要点 rtoax 2021年2月 1. 概要 1.1. 实时性补丁 补丁地址:CentOS 7 - RealTime for x86_64: RealTime: ke ...
- LINUX 编译内核选项 向作者致敬
Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...
最新文章
- 红帽企业版Linux成为Linux下的.NET Core的参考平台
- Java单元测试-快速上手Junit
- 在南京 学计算机 高职学校,2018南京专科学校有哪些 最新高职院校名单
- OS_CORE.C(3)
- 图片懒加载原理-实例二
- 创建可扩展性系统-4
- java 预处理语句_预处理语句PreparedStatement到底咋用啊
- GrowingIO创始人兼CEO张溪梦:互联网下半场,数据如何驱动企业突破增长重围?
- 鹅厂算法大神干货实录,初赛通关“秘籍”还不赶快来GET!
- 计算机会考操作题vb,2016年9月计算机二级考试《VB》上机操作题题库(2)
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_3、快速创建SpringBoot应用之手工创建web应用...
- VoLTE业务端到端流程:EPC侧信令流程
- Netty+WebSocket服务器完成Web聊天室(纯文字)
- iOS登录注册登录界面(UITextField)
- POI-HSSFWorkbook合并单元格边框及文字居中问题
- 渭城曲 / 送元二使安西
- Delphi 2007 体验
- Android Crash:Bad notification for startForeground
- 从苏宁电器到卡巴斯基第21篇:单证这一年(上)
- Elasticsearch+IK+pinyin自定义分词器