SylixOS内存访问错误解决方法(一)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月23日19:32:30 2 1,241

本文章介绍了一种分析内存错误提示信息,从而找到源码中错误代码位置的方法,为大家排查这类错误提供一种思路,起到抛砖引玉的作用。

1. 测试代码

测试代码如下:

#include <stdio.h>

int main (int argc, char **argv)
{
    sleep(2);
    volatile int *a = (int *)0x40; //设置物理地址

    printf("value = %x\n",*a); //读取物理地址中的值
    *a = 0x12; //设置物理地址中的值

    return  (0);
}

2. 运行结果

在2440模拟器上运行结果:

SylixOS内存访问错误解决方法(一)

  • 1表示测试程序的加载地址,这里为0x60030000。
  • 2表示引起错误的那条指令在内存中的地址,这里为0x600302ec。
  • 3表示引起内存访问错误的地址,这里是0x40,意思是系统进行了一个访问0x40这个内存地址的操作,从而导致了内存错误。
  • 4表示内存访问错误类型,这里是can not write,意思就是系统执行了一个写内存的操作,但是这个内存地址是不允许写的,从而引起内存错误。

3. 反汇编测试程序

本测试程序是用debug模式编译所得,将测试程序和sylixos-objdump工具拷贝到同一个目录下:

SylixOS内存访问错误解决方法(一)

在空白处按住shift并右击,选择“在此处打开命令窗口”:

SylixOS内存访问错误解决方法(一)

在打开的命令行中输入:

C:\Users\databus\Desktop\123>arm-sylixos-eabi-objdump.exe -S -d 2440_test_app >app.dis

在同一目录下将生成一个app.dis反汇编文件:

SylixOS内存访问错误解决方法(一)

4. 分析汇编文件

测试程序的加载地址=0x60030000,引起错误的那条指令在内存中的地址=0x600302ec。所以可以计算出引起错误的那条指令在内存中的偏移为0x600302ec-0x60030000=0x2ec。这个地址就是引起错误的那条指令在反汇编文件的偏移地址:

SylixOS内存访问错误解决方法(一)

可以看出0x2ec汇编地址处对应的是一条写内存指令,对应的c语句是“*a = 0x12”,这就是源码中出错的地方。

5. release和debug区别

首先来看debug模式下的汇编:

SylixOS内存访问错误解决方法(一)

从图中红框中的内容可以看出,在debug模式下变量是在栈中分配的,fp寄存器相当于x86中的ebp寄存器,通过操作fp就可以操作栈中变量对应的内存区。

接着来看下release模式下的汇编:

SylixOS内存访问错误解决方法(一)

不知道为啥,release版本反汇编出代码格式有问题。。。但是还是能看出一些东西。上图中第一个红框中的r0和r1分别表示printf中两个参数,其中r1表示的是“*a”的值,由此可见,release版本经过优化后,并没有一个内存空间用来表示a这个变量。这点也可以通过第二个红框中的内容来验证,r3中存放的是要写入到“*a”地址中的值,写入操作是通过一句“str r3, [r4, #64]”语句实现,同样没有一个内存空间用来表示a这个变量,对a变量的操作都被编译器优化到指令中了。

6. 驱动模块此类错误排查

通过上面的测试程序例子,大家可以看到,程序一开始就执行了sleep,这是为了有充分的时间通过modules命令查看程序的加载地址。但是如果驱动模块有内存错误的话,怎么查找呢?驱动模块中加sleep后,再通过modules命令是查看不到模块的加载地址的,这时可以先将module_init函数写成空函数,然后注册,接着通过modules查看模块的加载地址,获得加载地址后,接下来的分析方法就同应用程序一样了。

gewenbin
  • 本文由 发表于 2020年12月23日19:32:30
  • 转载请务必保留本文链接:http://www.databusworld.cn/9682.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:2   其中:访客  2   博主  0
    • lijiajie lijiajie 1

      lite sylixos没有MMU,没有这个偏移地址,崩了咋反汇编查呢?

      • liqingquan liqingquan 3

        打卡。