ARM模拟器——SkyEye的使用

本文详细介绍如何使用SkyEye模拟器进行ARM汇编程序开发与调试。从安装配置SkyEye到编写并运行ARM程序,再到启动Linux系统,一步步引导读者掌握SkyEye的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于希望学习ARM汇编的同学而言, 购买ARM开发板进行板上实测无疑是一个有效的方法,不过购买ARM开发板需要一笔费用,而且每次测试都需要连接开发板,比较麻烦。这里介绍一个ARM模拟器——SkyEye,通过SkyEye我们可以直接在一台PC上完成ARM汇编程序的开发和调试了,摆脱了ARM开发板的限制,真是不错!

下面介绍如何使用:

1.点击这里进入下载SkyEye的最新版,我的是skyeye-1.3.4_rc1.tar.gz,同时为了后面的实验,我们还要下载testsuite,这是skyeye的测试文件,我的版本是skyeye-testsuite-1.3.4,里面有ArmLinux

2.

tar zxvf skyeye-1.3.4_rc1.tar.gz

cd skyeye

根据INSTALL文件里说的:

./configure

make lib

make

sudo make install

sudo make install_lib

注意,在make时可能会缺各种文件,apt-get install就可以了,我所遇到的两个问题是:

python-dev和llvm没有安装,很简单:

sudo apt-get install python-dev

sudo apt-get install llvm

就可以了

这样SkyEye就算安装好了

3.

默认SkyEye是安装在/opt/下的,因此为了方便,我们在环境变量里把它的路径加入:

vi ~/.bashrc

输入:

#SkyEye 1.3.4

export PATH=/opt/skyeye/bin:$PATH

之后注销再登录或直接source .bashrc就可以使环境变量生效了

4.

SkyEye安装好后会在/opt/skyeye/testsuite下有一个arm_hello的测试程序,按如下方式运行:

cd /opt/skyeye/testsuite/arm_hello

skyeye -e arm_hello

#注意:skyeye要运行一个程序时必须要在这个程序的目录里,因为skyeye要读取这个程序的skyeye.conf配置文件,所以第一步我们要切换到/opt/skyeye/testsuite/arm_hello目录下

这时我们会进入skyeye命令模式,输入start让arm_hello程序开始运行,会弹出一个connecting to Ubuntu:xxx的字样的窗口

5.

skyeye命令行输入:run开始运行,这时窗口会不停的输出“helloworld”,说明arm_hello已经成功运行了!

6.

skyeye命令行输入:stop停止运行;输入:quit退出skyeye;输入:help查看帮助

下面介绍如何在SkyEye上启动Linux,就和在真实的ARM开发板上一样:

1.

解压testsuite测试文件:

tar zxvf skyeye-testsuite-1.3.4_rc1.tar.gz

其中的linux目录就是我们要移植到板子上的amrlinux,依次进入:s3c2410-->s3c2410x-2.6.36,有三个文件,vmlinux是Linux内核镜像,skyeye.conf是配置文件,initrd.img是临时根文件系统。我们在/opt/skyeye/testsuite下新建一个目录,然后copy过来:

sudo mkdir /opt/skyeye/testsuite/armlinux

cd linux/s3c2410/s3c2410x-2.6.36

sudo copy * /opt/skyeye/testsuite/armlinux

2.

cd /opt/skyeye/testsuite/armlinux

skyeye -e vmlinux

进入skyeye命令模式;

输入start打开串口窗口:

我在执行这一步时出错:failed to setup_module (name:net, type:cs8900a),我把skyeye.conf里的net那一行注释掉了,就行了

如果窗口没有打开,则修改:uart:mod=stdio为uart:mod=term,然后再试试

3.

skyeye命令行:run启动Linux,

屏幕随即会输出串口信息,不过速度很慢!

附几张图:

下面我们开始SkyEye的第二部分。


在SkyEye的使用(一)http://www.linuxidc.com/Linux/2012-10/71650.htm中我们简单介绍了如何使用SkyEye,并且成功运行了既有的arm_hello程序,不过这个是针对arm7的,现在我们要用SkyEye模拟s3c2410(arm920T)。

1.

首先在/opt/skyeye/testsuite下建立myhello目录:

mkdir /opt/skyeye/testsuite/myhello

2.

cd /opt/skyeye/testsuite/myhello

vi myhello.c

输入:

  1. #define INTERVAL 100000 
  2. void myhello(void
  3. {     
  4.   long * addr = (long *)0x50000020; 
  5.   int timeout = 0; 
  6.  
  7.   while(1) 
  8.   { 
  9.     timeout = 0; 
  10.     while(++timeout <= INTERVAL); 
  11.  
  12.     *addr = 'a'
  13.   } 
  14. }

地址0x50000020就是UART的通道0(UTXH0)的发送缓冲,把数据写入这个地址就会自动发送出去,当然在模拟器中,发送的目标地址就是我们的屏幕啦。

3.

myhello.c写好了之后,我们还要准备一段s3c2410的启动代码,这段代码在s3c2410一上电之后就开始执行,在这段启动代码中,回跳转到我们写的myhello.c函数:

vi start.S

输入:

  1. .text 
  2.     .align 4 
  3.     .global _start 
  4.  
  5. _start: 
  6.     ldr sp, =1024*4 
  7.     bl  myhello 
  8.  
  9. halt: 
  10.     b halt

上面这段很简单,就是声明了一个_start标记,这个标记在下面会用到,作为程序的入口地址。汇编和C链接的唯一必须的一步就是设置堆栈,这里我们把sp指向4k顶部,然后跳转到我们的c函数myhello

4.

现在我们要写一个连接脚本,连接顺序就是先start.S后myhello.c:

vi myhello.lds

输入:

  1. OUTPUT_ARCH(arm) 
  2. ENTRY(_start) 
  3. SECTIONS 
  4.   . = 0x00000000; 
  5.   .text :   
  6.   { 
  7.     start.o 
  8.     myhello.o 
  9.     *(.rodata) 
  10.   } 
  11.  
  12.   . = ALIGN(8192); 
  13.  
  14.   .data : {*(.data)} 
  15.  
  16.   .bss : {*(.bss)} 
  17. }

表示输出arm格式,第二句表示入口点是_start标记,就是第三步的那个_start标记,然后在0x00000000处先插入start.o,然后插入myhello.o

5.

然后我们要写Makefile:

vi Makefile

输入:

  1. CC=arm-linux-gcc 
  2. LD=arm-linux-ld 
  3. CFLAGS= -c -g -march=armv6 -mtune=arm920t   
  4. LDFLAGS= -N -p -X -Thello.lds 
  5.  
  6. myhello: start.o myhello.o 
  7.     $(LD) $(LDFLAGS)  start.o myhello.o -o myhello 
  8.     arm-linux-objdump -xS myhello > myhello.s 
  9.     arm-linux-readelf -a myhello > myhello.r 
  10.     arm-linux-nm myhello > myhello.n 
  11.        
  12. start.o: start.S 
  13.     $(CC) $(CFLAGS) start.S   
  14.      
  15. myhello.o: myhello.c 
  16.     $(CC) $(CFLAGS) myhello.c 
  17.  
  18. clean: 
  19.     rm -rf *.o myhello *.r *.n *.s

arm-linux-objdump -xS myhello > myhello.s

arm-linux-readelf -a myhello > myhello.r

arm-linux-nm myhello > myhello.n

6.

最后我们还需要一个skyeye配置文件:

vi skyeye.conf

输入:

  1. #skyeye config file 
  2. arch:arm 
  3. cpu: arm920t 
  4. mach: s3c2410x 
  5.  
  6. # boot  
  7. mem_bank: map=M, type=RW, addr=0x00000000, size=0x04000000, boot=yes 
  8.  
  9. # physical memory  
  10. mem_bank: map=M, type=RW, addr=0x30000000, size=0x02000000 
  11.  
  12. # all peripherals I/O mapping area  
  13. mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000 
  14.  
  15. uart:mod=term 
  16. #log: logon=0, logfile=./sk1.log, start=0, end=200000

7,

编译:

cd /opt/skyeye/testsuite/myhello

make

8.

好了,所有的文件已经准备好了,下面我们来测试:

cd /opt/skyeye/testsuite/myhello

skyeye -e myhello

在skyeye命令模式下输入:

start

run

我们会发现连续输出了字符“a”

完成!

PS:有网友建议:

源码中有两处值得商榷的地方:

1) Makefile 第3,4行, 建议为:

CFLAGS= -c -g -march=armv4 -mtune=arm920t

LDFLAGS= -N -p -X -Tmyhello.lds

2)skyeye.config 第15行, 建议为:

uart:mod=stdio


SimIt-ARM-3.0 给予命令行ARM指令模拟器,短小精悍,是研究ARM处理器的好工具,该模拟器既可以运行用户级别的ELF程序,又可以模拟运行Linux操作系统;提供了简单易用的调试命令,可以逐条跟踪指令的执行。 SimIt-ARM-3.0-gk-20150902.tar.bz2 HowTo 0.what is SimIt-ARM-3.0 SimIt-ARM 3.0 is an instruction-set simulator that runs both system-level and user-level ARM programs, for more about it please read user's guide file. 1.how to build tar jxvf SimIt-ARM-3.0-gk-20150902.tar.bz2 cd SimIt-ARM-3.0-gk ./configure make make install After these steps, the ./build/bindirectory contains the following programs: ema An ARM interpreter. To test the installation was successful type ./build/bin/ema test/wc configure modifiy PATH environment variable: PATH=$PATH:$HOME/SimIt-ARM-3.0-gk/build/bin ; export PATH 2. how to use 2.1 run user-level ARM programs [root@ORA9 SimIt-ARM-3.0-gk]# cd gcc-asm [root@ORA9 gcc-asm]# more hello.c /* * hello.c * Tue Sep 8 10:13:40 CST 2015 */ int main() { printf("hello world\n"); __asm("mov r0,#2\n\t" "swi 0x1\n\t"); // syscall: exit(2); } [root@ORA9 gcc-asm]# arm-linux-gcc -v Reading specs from /usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/specs Configured with: /opt/crosstool/crosstool-0.28/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2 --with-float=soft --with-headers=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux/include --with-local-prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 3.4.1 [root@ORA9 gcc-asm]# arm-linux-gcc hello.c -o hello -static [root@ORA9 gcc-asm]# ls -l hello* -rwxr-xr-x 1 root root 520775 Sep 8 10:18 hello -rw-r--r-- 1 root root 160 Sep 8 10:15 hello.c [root@ORA9 gcc-asm]# file hello hello: ELF 32-bit LSB executable, ARM, vers
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值