0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

hypervisor的调试分析方法

我快闭嘴 来源:嵌入式ARM和Linux 作者:嵌入式ARM和Linux 2022-10-08 09:40 次阅读

我们在编写裸机程序(baremetal)、虚拟化管理程序(hypervisor)和操作系统(OS)时,Debug分析程序是必不可少的。不像linux内核,有大量的调试方法,很多裸机程序、hypervisor没有完善的调试分析方法。

异常相关寄存器

但也不是无计可施,在硬件上,ARM架构为程序的异常行为提供了详细的寄存器:

ESR_ELx寄存器(x=1,2,3)

保存发生异常时的特征,比如异常分类(ESR_ELx.EC)、异常具体原因(ESR_ELx.ISS)等。

ELR_ELx寄存器(x=1,2,3)

保存发生异常时,保存要返回的地址,一般情况下就是发生异常时的指令地址。

FAR_ELx寄存器(x=1,2,3)

保存错误地址。

HPFAR_EL2寄存器

保存stage-2阶段的地址转换发生的错误IPA地址。

ARM从硬件架构上设计了4层异常级:EL0、EL1、EL2和EL3。不同特权等级的程序,运行在不同的异常级上。本文从hypervisor虚拟机管理程序的角度,讲解如何利用这些寄存器,对程序的异常情况进行分析。

hypervisor本身的abort异常

我们以meta-hypervisor出现的具体异常为例:

esr_el2=0x97010046
elr_el2=0xfd8000005880
far_el2=0xfd8000005880

在这儿,esr_el2的值为0x97010046,对应的位域为:

EC IL ISS
100101 1 1_0000_0001_0000_0000_0100_0110

EC = 100101:

说明是数据abort异常,但是没有发生异常级改变(EL2);或者,当支持嵌套虚拟化时与VNCR_EL2相关的访问产生的数据abort异常。

ISS编码(数据abort异常的具体原因)

ISV SAS SSE SRT SF AR VNCR LST FnV EA CM S1PTW WnR DFSC
24 23-22 21 20-16 15 14 13 12-11 10 9 8 7 6 5-0
1 00 0 00001 0 0 0 00 0 0 0 0 1 000110

通过上面各个位域的信息,综合得出:把W1寄存器中一个字节的数据写入内存时发生的错误。

我们再来看汇编代码中,0xfd8000005880地址处的内容:

void *memset(void *dest, uint32_t c, uint32_t count)
{
    // ......省略
        *d = c;
    fd8000005874:   b94007e0    ldr w0, [sp, #4]
    fd8000005878:   12001c01    and w1, w0, #0xff
    fd800000587c:   f9400fe0    ldr x0, [sp, #24]
    fd8000005880:   39000001    strb    w1, [x0]
        d++;
    fd8000005884:   f9400fe0    ldr x0, [sp, #24]
    fd8000005888:   91000400    add x0, x0, #0x1
    fd800000588c:   f9000fe0    str x0, [sp, #24]
}

代码中,fd8000005880: 39000001 strb w1, [x0]确实是往x0寄存器中的地址写入一个字节。这正好与我们对异常原因分析的结果相同。说明异常正是memset函数发生的错误。

ISV: 1, 说明23-14位保存着合法指令的异常信息

SAS: 00, 说明访问字节数据时产生的错误

SSE: 0, 字节访问不要求符号扩展

SRT: 00001,错误指令的Wt/Xt/Rt操作数的寄存器编号

SF: 0, 指令访问的是32位通用寄存器

AR: 0, 指令没有aquire/release语义

VNCR:0, 保留

LST: 00, 产生abort异常的指令未指定

FnV: 0, FAR寄存器是合法的

EA: 0, 表示不是外部abort

CM: 0, 表示错误不是由cache维护指令产生的

S1PTW: 0, 表示不是stage-2错误

WnR: 0, 表示写内存

DFSC:000110,L2地址翻译错误

如果memset函数只有一处调用的话,Bug原因结合代码就很容易分析出来了。但是,我们自己编写的hypervisor中有很多处调用memset函数的地方。所以,就文中的bug示例而言,目前还不能分析出原因。所以,我们需要使用qemu模拟器,通过gdb进行单步调试,看看出问题的代码位置(参见下一篇《QEMU+GDB调试ARM程序》)。

Guest OS的abort异常

我们设计的hypervisor支持Guest OS触发的4类异常,具体定义如下:

abort_handler_tabort_handlers[64]=
{
[ESR_EC_DALEL]=aborts_data_lower,
[ESR_EC_SMC64]=smc64_handler,
[ESR_EC_SYSRG]=sysreg_handler,
[ESR_EC_HVC64]=hvc64_handler
};

ESR_EC_HVC64 = 0x16:用于处理Guest OS发起的HVC调用,我们设计使用HVC指令在VM之间建立通信

ESR_EC_SMC64 = 0x17:用于处理Guest OS发起的SMC调用,我们知道ARM规定了PSCI规范,通过将电源管理等代码在ATF代码中实现,这样就实现了资源的安全管理。PSCI规范的底层就是通过SMC指令实现的。hypervisor需要将Guest OS发起的虚拟核的PSCI调用转发给物理核。

ESR_EC_SYSRG = 0x18:模拟寄存器和外设。因为Guest OS需要访问一些特殊寄存器和外设,而外设有时候需要多个VM共享,hypervisor对其进行模拟。

ESR_EC_DALEL = 0x24:用于处理Guest OS发生的abort异常。比如,Guest OS访问我们未指定的物理内存。

对于ESR_EL2寄存器的分析,与前面的一段一样,不在具体详述。

而HPFAR_EL2寄存器保存着出错的IPA地址,通过该地址,我们就可以知道,Guest OS访问哪块内存出错,就能解决某些bug了。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8651

    浏览量

    361773
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117712
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206730

原文标题:ARM深入理解-hypervisor调试方法一(异常寄存器分析)

文章出处:【微信号:嵌入式ARM和Linux,微信公众号:嵌入式ARM和Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    QEMU+GDB调试ARM程序

    通过GDB调试代码的便利性无需赘言。我们直接以调试meta-hypervisor为示例进行说明。
    的头像 发表于 10-08 09:17 2336次阅读

    电源管理入门:Hypervisor中的电源管理

    很多时候听说Hypervisor,但是对底层软件技术不了解的人感觉挺神秘。本篇文章简单介绍下Hypervisor的基本概念,另外介绍下电源管理在Hypervisor之上多OS间怎么应用。
    的头像 发表于 12-06 09:27 751次阅读
    电源管理入门:<b class='flag-5'>Hypervisor</b>中的电源管理

    Hypervisor的通讯带宽

    hello,大家好!如果在i.MX8上配置一个hypervisor架构,同时跑QNX和Linux两个系统,如果两个系统之间进行数据交互,带宽可以达到多少?有朋友知道吗?
    发表于 02-01 10:39

    解密ACRN:一个专为物联网而设计的Hypervisor

    解密 ACRN:一个专为物联网而设计的 Hypervisor
    发表于 05-05 13:47

    嵌入式Hypervisor的相关资料分享

    https://blog.csdn.net/bbc955625132551/article/details/71597863“hypervisor 的核心要素之一是页映射器,它将硬件指向特定操作系统
    发表于 11-09 07:58

    怎样通过波形分析方法调试UART收发呢

    首先对UART数据波形进行分析:本文通过对一步串行数据格式的分析,阐述通过波形分析方法调试UART收发原理和
    发表于 01-24 08:18

    Enea推出实现系统整合技术Enea Hypervisor

    Enea推出实现系统整合技术Enea Hypervisor Enea最新推出的Enea Hypervisor使Enea公司多核技术得到了进一步拓展。Enea Hypervisor (在多核处理器上实现了多元高性能计算环境的构建
    发表于 03-19 14:04 721次阅读

    Enea Hypervisor技术培训简化多核开发过程

    Enea Hypervisor技术培训简化多核开发过程 Enea公司最新推出的Enea Hypervisor使Enea公司多核技术得到了进一步拓展。Enea Hypervisor (www.enea.com/
    发表于 03-22 10:12 514次阅读

    Profibus调试方法

    Profibus调试方法
    发表于 04-27 08:50 9次下载

    基于matlab的dsp调试方法

    基于matlab的dsp调试方法
    发表于 10-23 14:35 8次下载
    基于matlab的dsp<b class='flag-5'>调试</b><b class='flag-5'>方法</b>

    关于ACRN Hypervisor和安卓娱乐系统的对比分析和介绍

    Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,具有空间隔离 (硬件隔离)/时域隔离、CPU,GPU资源共享、丰富的硬件资源共享以及IO虚拟化等特点。通过Hypervisor可以允许多个操作系统和应用共享一套基础物理硬件,通过它可以非中断地支持多工作
    的头像 发表于 09-03 16:33 2810次阅读

    嵌入式Hypervisor了解

    https://blog.csdn.net/bbc955625132551/article/details/71597863“hypervisor 的核心要素之一是页映射器,它将硬件指向特定操作系统
    发表于 11-03 20:36 3次下载
    嵌入式<b class='flag-5'>Hypervisor</b>了解

    虚拟化概述,Hypervisor简介

    主操作系统内嵌Hypervisor扩展,一般称为Type2 Hypervisor,基本管理功能可以通过主机操作系统实现,Hypervisor扩展只专注于虚拟化支持,与主机操作系统配合实现虚拟化功能。这类
    的头像 发表于 09-09 15:03 7610次阅读

    教程 8:调试方法

    教程 8:调试方法
    发表于 03-16 19:00 1次下载
    教程 8:<b class='flag-5'>调试</b><b class='flag-5'>方法</b>

    教程 8:调试方法

    教程 8:调试方法
    发表于 07-06 19:46 0次下载
    教程 8:<b class='flag-5'>调试</b><b class='flag-5'>方法</b>