当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > qemu+arm-linux-gdb模拟运行ARM程序

qemu+arm-linux-gdb模拟运行ARM程序 时间:2018-09-25      来源:未知

在进行ARM汇编语言学习的阶段,如果没有开发板和类似于JLink的JTAG硬件调试器时,那么通常会选择在PC机上模拟运行ARM程序。方法大致有两类,第一类方法就是安装像MDK或IAR的集成开发环境,在该集成开发环境中进行代码编写,编译,模拟运行并调试。该类方法的主要特点是简单、易用,但是这些集成开发环境通常都是用各自定义的汇编伪代码,需要进行熟悉;另一方面就是通常这类集成开发环境所支持的ARM核的版本不是很高,通常只能模拟运行ARM9及以下的ARM核,当然ARM公司的DS-5是一个不错的选择,但上述商业软件都是要付费的。第二类方法就是使用开源的模拟器加调试工具,大特点就是免费,并且能支持较高版本的ARM核,这也是本文要介绍的方法。整个环境的搭建分为以下几个步骤。

一、在Linux(如Ubuntu)中安装交叉编译工具链,这个步骤很简单,在这里不再赘述。需要注意的是交叉编译工具链中需要包含交叉的gdb调试工具,如果没有可以移植一个。

二、安装qemu模拟器,在Ubuntu-12.04的32位版本中可以使用下面的指令进行安装。

$ sudo apt-get install qemu qemu-system qemu-utils

三、编写测试代码。一个简单的测试代码包含下面四个文件。

start.S # ARM汇编源文件

1 .text

2 .global _start

3 _start:

4 ldr r0, stacktop

5 mov sp, r0

6

7 stop:

8 nop

9 b stop

10

11 stacktop: .word stack + 4 * 4096

12

13 .data

14 stack: .space 4 * 4096

Makefile

1 all:

2 arm-linux-gcc -g -c -o start.o start.S

3 arm-linux-ld -Tmap.lds -o test.elf start.o

4

5 run: all

6 qemu-system-arm -machine vexpress-a9 -m 256M -serial stdio -kernel test.elf -S -s &

7 sleep 3

8 arm-linux-gdb test.elf

9 clean:

10 rm -rf *.o test.elf

在上面Makefile中启动qemu模拟器的参数解释如下:

$ qemu-system-arm -machine vexpress-a9 -m 256M -serial stdio -kernel test.elf -S –s

-machine vexpress-a9:指定开发板,该开发板是QEMU中支持的一款ARM公司的基于Cortex-A9的开发板

-m 256M:指定物理内存的大小

-serial stdio:指定串口为标准输入输出

-kernel test.elf:指定要运行的elf格式的可执行文件

-S:虚拟机启动后立即暂停,等侍gdb连接

-s:在1234接受gdb调试连接

map.lds # 链接脚本

1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

2 OUTPUT_ARCH(arm)

3 ENTRY(_start)

4 SECTIONS

5 {

6 . = 0x0;

7 . = ALIGN(4);

8 .text :

9 {

10 start.o(.text)

11 *(.text)

12 }

13

14 . = ALIGN(4);

15 .rodata :

16 { *(.rodata) }

17

18 . = ALIGN(4);

19 .data :

20 { *(.data) }

21

22 . = ALIGN(4);

23 .bss :

24 { *(.bss) }

25 }

.gdbinit # gdb运行的初始化文件

1 target remote localhost:1234

四、编译并运行测试代码,执行下面的命令首先编译,然后运行,在gdb的命令行模式下即可进行程序的调试。

$ make

arm-linux-gcc -g -c -o start.o start.S

arm-linux-ld -Tmap.lds -o test.elf start.o

$ make run

arm-linux-gcc -g -c -o start.o start.S

arm-linux-ld -Tmap.lds -o test.elf start.o

qemu-system-arm -machine vexpress-a9 -m 256M -serial stdio -kernel test.elf -S -s &

sleep 3

arm-linux-gdb test.elf

GNU gdb 6.8

Copyright (C) 2008 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "--host=i686-build_pc-linux-gnu --target=arm-cortex_a8-linux-gnueabi"...

[New Thread 1]

_start () at start.S:4

4 ldr r0, stacktop

Current language: auto; currently asm

(gdb)

五、常用的gdb调试命令。

l:列出源代码

b 5:在5行设置断点

i b:查看断点信息

i r:查看寄存器值

set $r1 = 5:设置寄存器的值

p i:打印变量i的值

p/x i:以十六进制打印变量i的值

set var i = 3:设置变量i的值

x/16xb 0x0:以16进制形式查看0地址开始的16个字节的内存内容

bt:查看栈回溯信息

q:退出gdb

六、如果不太习惯命令行模式,则只需要使用一个gdb的图形前端,比如ddd。可以使用下面的命令来安装ddd。

$ sudo apt-get install ddd

七、安装完成后,修改Makefile,将:

arm-none-linux-gnueabi-gdb test.elf

改为:

ddd --debugger arm-none-linux-gnueabi-gdb test.elf

即可。运行后效果如下:

QEMU还可以模拟运行U-Boot及Linux操作系统,使用类似的方法也可以进行调试。这大大降低了ARM学习的成本。另外,gdb的前端还有insight、eclipse等,这些都能提供更友好的图形界面,从而使调试变得更加的简便。

上一篇:Linux内核模块文件组成介绍

下一篇:环境的搭建之远程访问linux系统

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部