[讨论] 阅读打卡第四站:基于x86_64解决宕机难题——《奔跑吧Linux内核2:调试与案例分析》

EEWORLD社区   2024-4-1 20:09 楼主

Linux阅读小组的成员:@iysheng @maskmoo @oxlm_1 @jobszheng5 @y909334873 @硬核王同学 @TL-LED @segFault @qiao--- @crimsonsnow

 

书籍第四站的打卡题目来啦,预计阅读完《奔跑吧Linux内核2:调试与案例分析》第四章可解答。

新的一周开启拉,跟上啦。

 

 

本站打卡题目

1.请简述Kdump的工作原理。
2.在x84_64架构里函数参数是如何传递的?
3.假设函数调用关系为main()→func1()→func2(),请画出x84_64架构的函数栈的布局图。

 

 

活动交流群

论坛有开设嵌入式交流群,欢迎感兴趣的小伙伴,微信添加“helloeeworld”为好友,对话:加入嵌入式交流群,入群交流。

扫码,对话:加入嵌入式交流群。

 

>>点此进入书籍打卡总站

微信搜索公众号“EEWORLDBBS”快去添加关注吧!

回复评论 (10)

1.请简述Kdump的工作原理。

基于Kexec,在系统崩溃时快速切换到一个备份的内核,保留第一个内核的内存信息,同时第二个内核对第一个内核的内存数据进行分析并将数据和分析结果保存下来。

2.在x84_64架构里函数参数是如何传递的?

当函数中参数的数量少于或等于6个时,使用通用寄存器来传递函数的参数。当函数的参数的数量大于6时,采用栈空间来传递函数的参数。

3.假设函数调用关系为main()→func1()→func2(),请画出x84_64架构的函数栈的布局图。

image.png  

点赞  2024-4-1 21:08
  1. Kdump的工作原理简述: Kdump是基于kexec的内核崩溃转储机制,在系统崩溃(比如内核panic)时捕获系统的内存镜像。

    系统运行的正常内核,被称为"第一知内核"。在系统初始化时,会预留一部分内存用于第二阶段使用。同时需要配置和启动kdump服务,这涉及指定转储文件的位置和大小。当系统遇到致命错误而崩溃时,内核会启动一个精简的第二阶段内核(也称为"崩溃内核"或"捕获内核"),通常从预留的内存中加载。这个"崩溃内核"接管系统,然后收集并保存第一阶段内核的内存镜像,保存到文件系统上的一个文件里。这个内存镜像对于后续分析系统崩溃原因非常有用。
  2. 在x86_64架构里函数参数是如何传递的: 在x86_64架构(也常写作x64或AMD64)中,函数参数传递调用约定最常见的是System V AMD64 ABI。根据这一约定,函数的前六个整数或指针参数通过寄存器传递,顺序依次是:RDI, RSI, RDX, RCX, R8, R9。超过这六个参数的,则通过函数调用的栈来传递。浮点数或是SIMD类型参数(如floatdouble__m128等)通过XMM寄存器传递,前八个参数使用XMM0XMM7。剩余的通过栈传递。

  3. 函数栈的布局图(main()→func1()→func2()): 在x86_64架构的函数栈中,栈是向下增长的(即向低地址增长)。简化示意如下(假设每一层函数都至少有一些局部变量和参数) image.png   image.png  

在实际应用中每个函数栈帧将包括函数返回地址、可能的参数传递(如果参数多于六个)、局部变量、以及调用的子函数所必需保存的任何寄存器值(调用者保存寄存器)

点赞  2024-4-4 20:58

1.请简述Kdump的工作原理。

答:Kdump即内核转储工具。Kdump的核心实现基于Kexec,Kexec的全程是Kernel execution,即内核执行,它非常类似于Linux内核中的exec系统调用。Kexec可以快速启动一个新的内核,他会跳过BIOS或者bootloader等引导程序的初始化阶段。这个特性可以让系统崩溃时快速切换到一个备份的内核,这样第一个内核的内存就得到保留。在第二个内核中可以对第一个内核产生的崩溃数据继续分析。
2.在x84_64架构里函数参数是如何传递的?

答:当函数中数的数量小于或等于6的时候,使用通用寄存器来传递函数的参数。当函数中参数的数量大于6的时候,采用栈空间来传递函数的参数。
3.假设函数调用关系为main()→func1()→func2(),请画出x84_64架构的函数栈的布局图。

答: 739063f32e955655809019017d64f36.jpg  

点赞  2024-4-4 21:21

1.请简述Kdump的工作原理。

kdump的核心实现基于kexec,kexec快速启动一个新的内核,称为生产内核。kdump会在内存中保留一块区域,用来存放捕获内核。在系统崩溃导致内核崩溃时候,快速切换到一个新的备份的内核,称为捕获内核,跳过bios,这样生产内核的内存就得到保留,在捕获内核中可以对生产内核产生的崩溃数据继续分析,把生产内核的完整信息,包括CPU寄存器,栈数据等,转储到指定文件中,接着使用crash工具来分析这个转储文件,以快速定位宕机问题。

2.在x84_64架构里函数参数是如何传递的?

当函数中数的数量小于或等于6的时候,使用通用寄存器来传递函数的参数。当函数中参数的数量大于6的时候,采用栈空间来传递函数的参数。
3.假设函数调用关系为main()→func1()→func2(),请画出x84_64架构的函数栈的布局图。

微信图片_20240406225625.jpg

 

点赞  2024-4-6 22:58

1.请简述Kdump的工作原理。

>>生产内核崩溃会快速启动Kexec,切换到捕获内核来对生产内核崩溃数据进行收集转储


2.在x84_64架构里函数参数是如何传递的?

>>当函数中数的数量小于或等于6的时候,使用通用寄存器来传递函数的参数。当函数中参数的数量大于 6 的时候,采用栈空间来传递函数的参数


3.假设函数调用关系为main()→func1()→func2(),请画出x84_64架构的函数栈的布局图。

图片.png  

Hello astroturfers
点赞  2024-4-7 11:22

1.请简述Kdump的工作原理。

Kdump的核心实现基于Kexec,Kexec的全称是 Kernel execution,即内核执行,它非常类似于Linux内核中的exec系统调用。Kexec可以快速启动一个新的内核,它会跳过BIOS或者bootloader等引导程序的初始化阶段。这个特性可以让系统崩溃时快速切换到一个备份的内核,这样第一个内核的内存就得到保留。在第二个内核中可以对第一个内核产生的崩溃数据继续分析。这里说的第一个内核通常称为生产内核( production kernel),是产品或者线上服务器主要运行的内核。第二个内核称为捕获内核(capture kernel),当生产内核崩溃时会快速切换到此内核进行信息收集和转储。

2.在x84_64架构里函数参数是如何传递的?

当函数中数的数量小于或等于6的时候,使用通用寄存器来传递函数的参数。当函数中参数的数量大于6的时候,采用栈空间来传递函数的参数。

3.假设函数调用关系为main()→func1()→func2(),请画出x84_64架构的函数栈的布局图。

image.png  

 

点赞  2024-4-7 20:01

 

1.请简述Kdump的工作原理。

Kdump的核心实现基于Kexec,即内核执行。Kexec可以快速启动一个新的内核,它会跳过bootloader等引导程序的初始化阶段。让系统崩溃时快速切换到一个备份的内核。这样第一个内核的内存得到保存,第二个内核中可以对第一个内核中产生的崩溃的数据继续分析。

 

2.在x84_64架构里函数参数是如何传递的?
当函数中数的数量小于或等于6时,使用通用寄存器来传递函数的参数。当函数中参数的数量大于6时,采用栈空间来传递函数的参数。


3.假设函数调用关系为main()→func1()→func2(),请画出x84_64架构的函数栈的布局图。 qq_pic_merged_1712625615270.jpg

 

点赞  2024-4-9 09:21

1. Kdump 会在内存中保留一块区域,用来存放捕获的内核。当内核崩溃时,Kdump通过Kexec机制自动启动捕获内核跳过 Bios,以免破坏生产内核的内存,然后将生产内核的完整信息转储到指定的文件中。

2. 当函数参数的数量小于等于6时,使用通用寄存器传递函数参数。当参数数量大于6时使用栈空间传递参数。

3.

Untitled Diagram.drawio.png

 

点赞  2024-4-10 18:51
点赞  2024-4-14 15:20
Q1:Kdump为内核转储工具。Kdump核心实现基于Kexec系统调用,其可快速启动一个新的内核,它会跳过BIOS或bootloader等引导程序的初始化阶段。此特性可以让系统崩溃时快速切换到一个备份的内核,这样第一个内核的内存就得到保留。在第二个内核中可以对第一个内核产生的崩溃数据继续分析。即当生产内核crash时,快速切换到备份内核,并进行信息收集和转储。
Q2:当函数中数的数量小于等于6时,使用通用寄存器来传递函数的参数。当大于6时,采用栈空间来传递函数的参数。
Q3:
eeworld_38.png

 

点赞  2024-5-1 16:50
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复