使用 SkyEye 模拟 ARM Linux

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

  下面介绍如何使用:

  1、下载 SkyEye 的最新版(https://sourceforge.net/projects/skyeye/),本文用的是 skyeye-1.3.4_rc1.tar.gz,同时为了后面的实验,还要下载 testsuite,它是 skyeye 的测试文件,这里的版本是 skyeye-testsuite-1.3.4,里面有 ArmLinux。

  2、安装 SkyEye。

$ 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/ 下的,因此为了方便,我们在环境变量里把它的路径加入,我们写到 .bashrc 文件中,打开它:

$ vi ~/.bashrc

  输入:

#SkyEye 1.3.4
export PATH=/opt/skyeye/bin:$PATH

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

4、运行 arm_hello 测试程序。

  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、确保 arm_hello 正常运行。

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

6、arm_hello 的其他命令。

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


  显然,上面只是安装好了 SkyEye,我们的目的是在 SysEye 中模拟 ARM Linux。那么,下面就来介绍如何在 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、运行 vmlinux 。

$ cd /opt/skyeye/testsuite/armlinux
$ skyeye -e vmlinux

  进入 skyeye 命令模式,输入 start 打开串口窗口。
  (我在执行这一步时出错:failed to setup_module (name:net, type:cs8900a),我把 skyeye.conf 里的 net 那一行注释掉了,就行了。)
  如果窗口没有打开,则修改 uart:mod=stdiouart:mod=term,然后再试试。

3、启动 Linux 。

  在 skyeye 命令行输入 run 启动Linux,屏幕随即会输出串口信息,不过速度很慢!

附几张图:

这里写图片描述


  上面我们简单介绍了如何使用 SkyEye,并且成功运行了既有的 arm_hello 程序,不过这个是针对 arm7 的,现在我们要用 SkyEye 模拟 s3c2410(arm920T)。下面我们开始 SkyEye 的第二部分。

1、首先在 /opt/skyeye/testsuite 下建立 myhello 目录。

$ mkdir /opt/skyeye/testsuite/myhello

2、添加 myhello.c 文件。

$ cd /opt/skyeye/testsuite/myhello
$ vi myhello.c

  输入如下内容:

#define INTERVAL 100000 
void myhello(void) 
{     
  long * addr = (long *)0x50000020; 
  int timeout = 0; 

  while(1) { 
    timeout = 0; 
    while(++timeout <= INTERVAL); 

    *addr = 'a'; 
  } 
}

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

3、准备启动代码。

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

$ vi start.S

  输入如下内容:

.text 
    .align 4 
    .global _start 

_start: 
    ldr sp, =1024*4 
    bl  myhello 

halt: 
    b halt

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

4、编写链接脚本。

  链接的顺序就是先 start.S 后 myhello.c,打开 myhello.lds 文件:

$ vi myhello.lds

  输入如下内容:

OUTPUT_ARCH(arm) 
ENTRY(_start) 
SECTIONS 
{ 
  . = 0x00000000; 
  .text :   
  { 
    start.o 
    myhello.o 
    *(.rodata) 
  } 

  . = ALIGN(8192); 

  .data : {*(.data)} 

  .bss : {*(.bss)} 
}

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

5、编写 Makefile 文件。

$ vi Makefile

  输入如下内容:

CC=arm-linux-gcc 
LD=arm-linux-ld 
CFLAGS= -c -g -march=armv6 -mtune=arm920t   
LDFLAGS= -N -p -X -Thello.lds 

myhello: start.o myhello.o 
    $(LD) $(LDFLAGS)  start.o myhello.o -o myhello 
    arm-linux-objdump -xS myhello > myhello.s 
    arm-linux-readelf -a myhello > myhello.r 
    arm-linux-nm myhello > myhello.n 

start.o: start.S 
    $(CC) $(CFLAGS) start.S   

myhello.o: myhello.c 
    $(CC) $(CFLAGS) myhello.c 

clean: 
    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

  输入如下内容:

#skyeye config file 
arch:arm 
cpu: arm920t 
mach: s3c2410x 

# boot  
mem_bank: map=M, type=RW, addr=0x00000000, size=0x04000000, boot=yes 

# physical memory  
mem_bank: map=M, type=RW, addr=0x30000000, size=0x02000000 

# all peripherals I/O mapping area  
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000 

uart:mod=term 
#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
对于那些想进行嵌入式系统软件开发和学习,或者想研究嵌入式Linux等操作系统和一些底层系统软件(如TCP/IP等)的研究和开发人员来说,可能存在如下几方面的问题:(1)经常苦于经费不足,缺少足够的硬件开发板和完善的软件开发环境,相关的书籍对一些最新软件的分析还不够全面,无法深入研究和开发嵌入式软件。(2)高层次的软件设计和开发一般不用太考虑底层硬件的实现细节,如果直接处于一个具体的硬件环境下,在开发和研究中可能会陷入硬件的具体细节中不能自拔,而不能把精力放到高层次的软件设计和开发上。(3)如果硬件开发环境不太稳定(这种情况经常见到),且对具体的硬件不是很了解,则可能在排除问题上花费大量的不必要的时间。(4)如果你想自己尝试设计一个操作系统,则先在一个提供源码级调试的软件仿真器上进行开发,可能会大大提高你的开发进度。<br><br>对于想了解、学习一般操作系统的实现原理,Linux/μCLinux操作系统或TCP/IP等系统级软件的实现的人员,目前一般采用的方法是看书和读源代码,这是一种静态的学习方法,效率较低,比较枯燥,缺少亲自实践的感觉。要想深入分析和开发软件,就要动手编程,不能只是看看书,读读代码,只有通过亲手实践才能够掌握软件设计的核心内容。上面所指出的问题和需求促使SkyEye项目的诞生。 <br><br>3.SkyEye的目标和意义 <br>SkyEye是一个开源软件(OpenSource Software)项目,中文名字是"天目"。SkyEye的目标是在通用的Linux和Windows平台上实现一个纯软件集成开发环境,模拟常见的嵌入式计算机系统(这里假定"仿真"和"模拟"的意思基本相同);可在SkyEye上运行μCLinux以及μC/OS-II等多种嵌入式操作系统和各种系统软件(如TCP/IP,图形子系统,文件子系统等),并可对它们进行源码级的分析和测试。<br><br>3.SkyEye的目标和意义 <br>SkyEye是一个开源软件(OpenSource Software)项目,中文名字是"天目"。SkyEye的目标是在通用的Linux和Windows平台上实现一个纯软件集成开发环境,模拟常见的嵌入式计算机系统(这里假定"仿真"和"模拟"的意思基本相同);可在SkyEye上运行μCLinux以及μC/OS-II等多种嵌入式操作系统和各种系统软件(如TCP/IP,图形子系统,文件子系统等),并可对它们进行源码级的分析和测试。<br><br>纯软件的模拟器有许多种,如模拟一个芯片时序逻辑的模拟器、只模拟CPU指令的模拟器、模拟整个硬件开发板的模拟器、模拟一个PDA的模拟器等。存在一些纯软件的仿真器或模拟器,如Stanford大学的SimOS模拟器,它仿真的是MIPS系列CPU和相关外设,可以在其上运行SGI公司的Irix操作系统和软件,目前基本上停止了进一步的开发;PSIM是一个仿真PowerPC指令集的模拟器,目前只支持简单的命令行应用程序;xcopilot是一个PDA模拟器,它是由Greg Hewgill出于个人喜好编写的,它仿真的是M68K CPU,通过它可以给基于PalmOS的软件开发者提供一个模拟开发环境。Bochs是一个仿真x86 CPU的开源项目,目前还支持AMD64 CPU,在它上面可以运行Linux操作系统。其它一些商业的仿真软件如vmware和virtualPC可以仿真一个真实的x86计算机,而Virtutech Simics仿真器可以仿真多种CPU和硬件,功能强大,可用于硬件和系统软件的评测。<br><br>SkyEye是一个指令级模拟器,可以模拟多种嵌入式开发板,可支持多种CPU指令集,在SkyEye上运行的操作系统意识不到它是在一个虚拟的环境中运行,而且开发人员可以通过SkyEye调试操作系统和系统软件。由于SkyEye的目标不是验证硬件逻辑,而是协助开发、调试和学习系统软件,所以在实现上SkyEye与真实的硬件环境相比还是有一定差别的。SkyEye在时钟节拍的时序上不保证与硬件完全相同,对软件透明的一些硬件仿真进行了一定的简化。这样带来的好处是SkyEye的执行效率更高。SkyEye的推出具有下面三方面的意义:<br><br>通过SkyEye仿真集成环境可以很方便地进入到嵌入式系统软件学习和开发的广阔天地中。尤其对于缺少嵌入式硬件开发环境和软件开发环境的用户来说,它将是一个非常有效的学习工具和开发手段,因为SkyEye的整个软件系统都是Open Source的,且基于GPL协议(μCOS-II除外)。因此,如果要学习Linux操作系统或者进行嵌入式系统开发,但苦于没有硬件支持,SkyEye仿真环境软件是一个很好的选择! <br>如果想研究与具体硬件无关的系统软件(如TCP/IP协议栈等
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿基米东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值