Linux内核转储---kdump原理梳理
文章目录
- Kexec和Kdump设计的区别
- kexec
- kdump
- Kdump的执行流程
- kexec的实现
- 用户空间kexec
- 内核空间
- vmcore
Kdump的实现可以分为两部分:内核和用户工具。内核提供机制,用户工具在这些机制上实现各种转储策略,内核机制对用户工具的接口是一个系统调用:kexec_load(),其被用来加载捕获内核和传递一些相关信息。
Kdump是一种先进的基于kexec的内核转储机制,用来捕获kernel crash(内核崩溃)的时候产生的crash dump。当内核产生错误(系统崩溃、死锁或者死机)时,kdump会将内存导出为vmcore保存到磁盘。
Kdump是kexec机制工作的,kexec是一个快速启动机制,允许通过已经运行的内核的上下文启动一个Linux内核,不需要经过BIOS。
Kexec和Kdump设计的区别
kexec
Kexec的设计是用新内核去覆盖原内核位置,Kexec的实现包括两部分:
- 一是内核空间的系统调用:kexec_load(),负责在生产内核(first kernel)启动时将捕获内核(capture kernel)加载到指定地址。
- 二是用户空间的工具kexec-tools,他将捕获内核的地址传递给生产内核,从而在系统崩溃的时候能够找到捕获内核的地址并运行。没有kexec就没有kdump。先有kexec实现了在一个内核中可以启动另一个内核,才让kdump有了用武之地。
- 内核空间:kexec_load()
- kexec 在 kernel 里以一个系统调用 kexec_load()的形式提供给用户。这个系统调用主要用来把另一个内核和其 ramdisk 加载到当前内核中。在 kdump中,捕获内核只能使用事先预留的一小段内存。生产内核的内存镜像会被以 /proc/vmcore 的形式提供给用户。这是一个 ELF格式的文件,它的头是由用户空间工具 kexec 生成并传递来的。在系统崩溃时,系统最后会调用machine_kexec()。这通常是一个硬件相关的函数。它会引导捕获内核,从而完成 kdump 的过程。
用户空间:kexec_tools - kdump 的很大一部分工作都是在用户空间内完成的。与 kexec相关的集中在一个叫“kexec-tools”的工具中的“kexec”程序中。该程序主要是为调用 kexec_load()收集各种信息,然后调用之。这些信息主要包括 purgatory 的入口地址,还有一组由 struct kexec_segment描述的信息。
Kexec设计原理图如下:
kdump
- kdump机制的实现需要两个不同目的的内核,生产内核和捕获内核。生产内核是捕获内核服务的对像。捕获内核会在生产内核崩溃时启动起来,与相应的ramdisk一起组建一个微环境,用以对生产内核下的内存进行收集和转存。
- 第一个内核保留了内存的一部分给第二内核启动用。由于kdump利用kexec启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。
- 为了在生产内核崩溃时能顺利启动捕获内核,捕获内核以及它的ramdisk是事先放到生产内核的内存中的。
- 生产内核的内存是通过/proc/vmcore这个文件交给捕获内核的。为了生成它,用户工具在生产内核中分析出内存的使用和分布等情况,然后把这些信息综合起来生成一个ELF头文件保存起来。捕获内核被引导时会被同时传递这个ELF文件头的地址,通过分析它,捕获内核就可以生成出/proc/vmcore。有了/proc/vmcore这个文件,捕获内核的ramdisk中的脚本就可以通过通常的文件读写和网络来实现各种策略了。
- Kdump的设计是预留一块内存来加载第二个内核(和相关数据),发送Crash后第二个内核在原位置运行(不然就达不到相关目的了),收集第一个内核的相关内存信息。
kudmp的设计原理图:
- 捕获内核运行所需的内存一开始就被保留,在系统内核崩溃时被加载也不会影响系统内核本身的内存。并且在由于崩溃引起的重起中,新内核只会用到很少的内存,比如仅仅 16 兆字节,剩下的内存不会被用到,可以转储出来。
- 新内核被启动后,转储过程的下一个阶段是提供写转储文件到目标设备的接口。在新内核中,有两个部分来获取要转储的内容。第一个部分用来处理内存被对待的方式,第二个部分用来处理用户空间怎样获取转储文件。第一部分被设计成把新内核未用的内存(前面出问题的内核的)当成高端内存设备。本质上,在第二次启动中,系统等价于一个有很大数值的高端内存的机器。在转储的过程中,在这个区域的页被映射成一个页表项,用这种方式去读要转储的内容的话,转储文件会被抽象成在/proc 下的一个文件,比如/proc/vmcore。用户
仅仅需要像拷贝一个通常的文件一样拷贝转储文件。相似的,/proc/vmcore 也将对内核页转储起同样的作用。这个方法的另一个好处是转储文件会被自动存成 ELF格式,像 gdb 和 crash 等工具能够被直接用来分析转储出来的文件。
Kdump的执行流程
Kdump的执行流程如下图所示:
基本流程为:
- First kernel(生产内核)正常运行;
- 运行过程中,系统出现异常(也可以是模拟通过sysrq触发panic);
- 在系统崩溃时,系统最后会调用 machine_kexec(),触发并启动Sencond kernel(捕获内核),传递ELF头文件的地址;
- 捕获内核与相应的ramdisk一起组建一个微环境,获取ELF头文件的地址,并生成出/proc/vmcore文件;
- 捕获内核的ramdisk中的脚本开始执行,将/proc/vmcore文件中的数据通过文件读写和网络来实现对生产内核下的内存进行收集和转存;
- 通过gdb、crash等工具,对收集到的vmcore文件镜像分析。
kexec的实现
Kexec的实现包括用户空间和内核空间。
用户空间kexec
本质上是一个系统调用,主要做的事情有:
- 获取reserved内存块,读取/proc/iomem中Crash kernel字段的信息
- 把指定的内核放到自己定义的变量中,名字为struct kexec_info,包含代码段和加载地址,还有其他信息,如设备树、启动参数cmdline等。指定的加载地址空间来自reserved内存块。
- 设置vmcore的生成开关—elfcorehdr。
内核空间
内核层会完成kexec_info接收,设置新内核实体。
Kexec会陷入系统调用:
SYSCALL_DEFINE4(kexec_load,unsigned long,entry,unsigned long,nr_segments,struct kexec_segment __user *,segments,unsigned long,flags)
其主函数为:do_kexec_load::
static int do_kexec_load(unsigned long entry, unsigned long nr_segments,struct kexec_segment __user *segments, unsigned long flags)
{struct kimage **dest_image, *image;unsigned long i;int ret;if (flags & KEXEC_ON_CRASH) {//新内核 kexec_crash_imagedest_image = &kexec_crash_image; if (kexec_crash_image)arch_kexec_unprotect_crashkres();} else {dest_image = &kexec_image;}if (nr_segments == 0) {/* Uninstall image */
//卸载内核kimage_free(xchg(dest_image, NULL));return 0;}if (flags & KEXEC_ON_CRASH) {//清除新内核内容kimage_free(xchg(&kexec_crash_image, NULL));}//将kexec_info 读进来,存到image中ret = kimage_alloc_init(&image, entry, nr_segments, segments, flags);if (ret)return ret;if (flags & KEXEC_PRESERVE_CONTEXT)image->preserve_context = 1;ret = machine_kexec_prepare(image);if (ret)goto out;ret = kimage_crash_copy_vmcoreinfo(image);if (ret)goto out;//将各个段存到指定的加载地址,使用kmap,本质上就是从加载地址获取一个page,转为地址,然后存到该地址//如果预留内存不足,返回-ENOMEMfor (i = 0; i < nr_segments; i++) {ret = kimage_load_segment(image, &image->segment[i]);if (ret)goto out;}kimage_terminate(image);/* Install the new kernel and uninstall the old *///安装新内核并卸载老内核image = xchg(dest_image, image);
out:if ((flags & KEXEC_ON_CRASH) && kexec_crash_image)arch_kexec_protect_crashkres();kimage_free(image);return ret;
}
各个段的存放地址是在reserved中…
Panic后会加载新内核:__crash_kexec:
读取新内核信息,然后热重启,重启与架构有关。Arm64会执行cpu_soft_restart,然后调用到汇编。
vmcore
Vmcore的生成是initcall函数自动完成的:
相关文章:
Linux内核转储---kdump原理梳理
文章目录Kexec和Kdump设计的区别kexeckdumpKdump的执行流程kexec的实现用户空间kexec内核空间vmcoreKdump的实现可以分为两部分:内核和用户工具。内核提供机制,用户工具在这些机制上实现各种转储策略,内核机制对用户工具的接口是一个系统调用…...
【C++】从0到1入门C++编程学习笔记 - 实战篇:演讲比赛流程管理系统
文章目录一、演讲比赛程序需求1.1 比赛规则1.2 程序功能1.3 程序效果图:二、项目创建2.1 创建项目2.2 添加文件三、创建管理类3.1创建文件3.2 头文件实现3.3 源文件实现四、菜单功能4.1 添加成员函数4.2 菜单功能实现4.3 测试菜单功能五、退出功能5.1 提供功能接口5…...
04 OpenCV位平面分解
1 基本概念 位平面分解的核心思想是将图像的每一个像素分解为多个二进制位,分别存储在不同的位平面上。例如,如果一个图像是8位深度的,则可以分解为8个位平面,每个位平面上存储一个二进制位。 位平面分解在图像压缩中有着重要的…...
Onvif协议如何判断摄像机支持 —— 筑梦之路
有人就问什么是Onvif协议呢? 全称为:Open Network Video Interface Forum.缩写成Onvif。 翻译过来是:开放型网络视频接口论坛,目的是确保不同安防厂商的视频产品能够具有互通性,这样对整体安防行业才是良性发展。 现…...
情人节new一个对象给你
今天情人节,有没对象的吗?假设你不知道new怎么用,每个人都有两种身份,一种没对象的人,这个时候new一个对象给你,一种是有对象的人,这个delete对象。等你学完这个new和delete知识点,无…...
linux篇【15】:应用层-网络https协议
目录 一.HTTPS介绍 1.HTTPS 定义 2.HTTP与HTTPS (1)端口不同,是两套服务 (2)HTTP效率更高,HTTPS更安全 3.加密,解密,密钥 概念 4.为什么要加密? 5.常见的加密方式…...
索引-性能分析-explain
explain 执行计划 explain 执行计划各字段含义 1)id 就是代表 sql 的执行顺序或者表的执行顺序;id相同从上往下执行,id不同,id值越大越先执行;(注:有子查询时就会出现sql执行顺序)…...
mbedtls加密组件使用示例
1 mbedtls aes组件的使用 1.1 AES ECB加解密接口使用 int main(int argc, char *argv[]) {char key[256];char *inbuf calloc(1, 257);char *outbuf calloc(1, 257);char *buf calloc(1,257);char *tmp_outbuf outbuf;char *tmp_buf buf;mbedtls_aes_context aes_ctx;mb…...
如何量测太阳光模拟器的光谱致合度?
太阳模拟器是根据国际法规JIS、IEC60904、美国材料试验协会开发设计的AAA级太阳模拟器。对于100毫米100毫米和200毫米200毫米的光斑尺寸,光斑强度的输出功率范围可以从0.1到1太阳光强度。此外,还提供了灵活的出光方向,以满足用户的研究需求&a…...
网络安全领域中CISP证书八大类都有什么
CISP注册信息安全专业人员 注册信息安全专业人员(Certified Information Security Professional),是经中国信息安全产品测评认证中心实施的国家认证,对信息安全人员执业资质的认可。该证书是面向信息安全企业、信息安全咨询服务…...
17- 梯度提升回归树GBRT (集成算法) (算法)
梯度提升回归树: 梯度提升回归树是区别于随机森林的另一种集成方法,它的特点在于纠正与加强,通过合并多个决策树来构建一个更为强大的模型。该模型即可以用于分类问题,也可以用于回归问题中。在该模型中,有三个重要参数分别为 n_…...
05 OpenCV色彩空间处理
色彩空间(Color Space)是一种用于描述颜色的数学模型,它将颜色表示为多维向量或坐标,通常由三个或四个独立的分量来表示。不同的色彩空间在颜色的表示方式、可表达颜色的范围、计算速度和应用场景等方面存在差异,不同的…...
【CS224图机器学习】task1 图机器学习导论
前言:本期学习是由datawhale(公众号)组织,由子豪兄讲解的202302期CS224图机器学习的学习笔记。本次学习主要针对图机器学习导论做学习总结。1.什么是图机器学习?通过图这种数据结构,对跨模态数据进行整理。…...
Powershell Install SQL Server 2022
前言 SQL Server 2022 (16.x) 在早期版本的基础上构建,旨在将 SQL Server 发展成一个平台,以提供开发语言、数据类型、本地或云环境以及操作系统选项。 SQL Server Management Studio (SSMS) 是一种集成环境,用于管理从 SQL Server 到 Azure SQL 数据库的任何 SQL 基础结构…...
Jetson NX2 装机过程
1.固态硬盘安装完成后,系统配置 df -h 查看硬盘使用情况 2.查看Jetson NX的IP地址,以下两个都行 ifconfig ip address show 3.Jetson NX2安装arm64的annaconda3,安装有问题报错illegal instruction,未解决。 4.VNC远程登录 …...
初始C++(四):内联函数
文章目录一.内联函数概念二.内联函数用法三.内联函数的特性四.内联函数和宏一.内联函数概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。 二.内联函…...
九、初识卷积
文章目录1、通过边缘检测认识卷积2、Padding3、Strid Convelution4、RGB图像的卷积THE END1、通过边缘检测认识卷积 \qquad在使用神经网络进行图像识别时,神经网络的前几层需要完成对图像的边缘检测任务,所谓的边缘检测就是让计算机识别出一张图片的垂直…...
【Linux】【编译】编译调试过程中如何打印出实际的编译命令
🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:Linux技术&…...
linux安装jdk
step1 下载jdk 到下面的网站下载需要的jdk安装包版本。 Java Downloads | Oracle step2 复制到opt目录 其中user_name对应自己的home目录的用户文件夹 sudo cp /home/user_name//home/czh/Downloads/jdk-17_linux-x64_bin.tar.gz /opt/ step3 到opt目录解压安装包…...
迅为iTOP-3A5000龙芯开发板安装UOS操作系统
3A5000板卡采用全国产龙芯3A5000处理器,基于龙芯自主指令系统(LoongArch),市面上龙芯3A5000主板价格都在上万元,可以说是非常贵了, 迅为全新推出了款千元内的iTOP-3A5000开发板,这款板卡各方面的配置也是第…...
Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)
Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接:https://sysin.org/blog/chrome-firefox-download/,查看最新版。原创作品,转载请保留出处。 作者主页:www.sysin.org 天下只剩三种(主流&am…...
如何使用ArcGIS转换坐标
1.概述大家都知道ArcGIS提供了坐标转换功能,在我们手里的数据坐标系千差万别,经常会遇到转换坐标的时候,那么是否可以用ArcGIS进行转换?答案是肯定的,但是转换的过程比较复杂,这里为大家介绍一下转换的方法…...
链表基本原理
链表基本原理1.链表1.1 基本原理1.2 链表大O记法表示2. 链表操作2.1 读取2.2 查找2.3 插入2.4 删除3.链表代码实现1.链表 1.1 基本原理 节点 组成链表的数据格子不是连续的。可以分布在内存的各个位置。这种不相邻的格子就叫结点。每个结点保存数据还保存着链表里的下一结点的…...
基于JAVA+SpringBoot+Vue+ElementUI中学化学实验室耗材管理系统
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 当前,中学…...
1.输入子系统学习-struct input_dev-2023.02
内核版本:4.4.194 平台相关:rk3399 目前主要是看的触摸屏的代码 目录 一、include/linux/input.h(struct_input_dev) 二、结构体的注释部分(百度翻译) 三、Documentation/input/event-codes.txt&…...
解决:PDFBox报的java.io.IOException: Missing root object specification in trailer
文章目录问题描述原因分析解决方案问题描述 使用pdfbox类库操作pdf文件时,遇到下面的报错信息: java.io.IOException: Missing root object specification in trailer PDFBox参考: https://pdfbox.apache.org/ Apache PDFBox 库是一个开源的…...
MAC OSX安装Python环境 + Visual Studio Code
MAC上开发python怎么能少得了python3环境呢,而安装python3环境的方式也有多种,这里仅选用并记录本人认为比较方便的方式 安装Homebrew Homebrew是macOS 缺失的软件包管理器, 使用它可以在MAC上安装很多没有预装的东西,详细说明可…...
音乐 APP 用户争夺战,火山引擎 VeDI 助力用户体验升级!
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 国内数字音乐市场正在保持稳定增长。 根据华经产业研究院数据报告显示,2020 年数字音乐市场规模为 357.3 亿元,到 2022 年市场规模已增长至 482.7 …...
CAP和BASE理论
CAP理论CAP是 Consistency、Availability、Partition tolerance 三个词语的缩写,分别表示一致性、可用性、分区容忍性。它指出一个分布式计算系统不可能同时满足以下三点:• 一致性(Consistency) :等同于所有节点访问同…...
基于商品理解的成交能力和成交满意度优化在Lazada的实践
作者:马蕊 Lazada推荐算法团队 在Lazada各域推荐场景中,既有优质商品优质卖家不断涌现带来的机会,也有商品质量参差带来的问题。如何才能为用户提供更好的体验,对卖家变化行为进行正向激励呢?下面本文将为大家分享我们…...
沈阳做网站/视频剪辑培训
大王,1>小王,2>方片2,3>梅花2,4>红心2,5>黑桃2,6>方片A,7>梅花A,8>红心A,9>黑桃A,10>方片K,11>梅花K,12>红心K,13>黑桃K,14>方片Q,15>梅花Q,16>红心Q,17>黑桃Q,18>方片J,19>梅花J,20>红心J,21>黑桃J,22>方片…...
购物网站开发的背景/小白如何学电商运营
一、携程网首页案例 访问地址:m.ctrip.com 1. 技术选型 方案:我们采取单独制作移动页面方案 技术:布局采取flex布局 2. 搭建相关文件夹结构 3. 设置视口标签以及引入初始化样式 <meta name="viewport" content="width=device-width, user-scalable=no…...
泰安企业建站公司服务/郑州seo优化顾问
一直对抖音上的各种人脸处理算法很感兴趣,个别的我觉得目前的水平我能写个简单的实现方式,但是涉及复杂的,还是太菜了。但是之前在抖音上看到了一个用网页写的旋转汉字时钟的视频,感觉很好玩,而且我觉着写出来完全没问…...
制作网站公司图片/网络推广竞价外包
class Apple implements Runnable{private int num50;public void run() {for(int i0;i<50;i) {if(num>0) {System.out.println(Thread.currentThread().getName()"吃了编号为"num--"的苹果");}}} } //使用Runnable方式实现,三个同学吃50…...
网站开发与设计难嘛/竞价开户推广
<%: ViewData["Message"] %> 冒号的绑定可以自动转换HTML编码的代码(所以我一直无法在前台显示我在后台拼接的HTML代码,而使用 Response.Write(pager.MvcPager()) 又是正常显示的) <% Model.ModelPagerHtmls %> 等号的…...
山东省建设协会网站/如何自己开个网站平台
我们现在测试环境与生产环境内容越来越多,导致研发环境发布测试环境,测试环境发布生成环境时每次更改访问域名或者固定数据文件时每次都需要大范围更改,所以使用脚本动态判断动态引入js文件,通过配置js文件来达到研发环境、测试环…...