使用 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=stdio
为 uart: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.sarm-linux-readelf -a myhello > myhello.rarm-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
使用 SkyEye 模拟 ARM Linux相关推荐
- linux 模拟arm,拒绝开发板, 用 SkyEye 就可以模拟 ARM Linux!
描述 对于希望学习 ARM 汇编的同学而言, 购买 ARM 开发板进行板上实测无疑是一个有效的方法,不过购买 ARM 开发板需要一笔费用,而且每次测试都需要连接开发板,比较麻烦.这里介绍一个 ARM ...
- 用QEMU模拟ARM开发板,搭建Linux kernel运行环境
前言 有的时候我们想调试linux kernel或者linux应用程序,但是又没有硬件环境,这个时候可以选择用模拟器的方法,模拟出一个硬件环境. Android emulator Android系统的 ...
- linux虚拟arm环境环境,Ubuntu 模拟ARM开发环境
为了简化开发和测试过程,Ubuntu从9.10开始提供静态的ARM虚拟功能,可以直接在PC机上建立ARM机器的chroot环境,既可以编译,也可以测试程序.相比于交叉编译而言,这种方法虽然编译速度较慢 ...
- 安卓模拟器 arm linux,让x86的android模拟器能模拟arm架构系统
原标题:让x86的android模拟器能模拟arm架构系统 网上介绍共计三种模拟器比较常用,分别是bluestacks.andy和Genymotion,前者支持ARM架构,中者支持远程控制,后者启动速 ...
- 嵌入式基于Linux电机控制,基于嵌入式arm+linux平台的直流电机调速控制系统.pdf
2012--2013 学年第 二 学期 物电 学院期末考试卷 嵌入式系统与应用 学号 : 姓名 : 班级 : 成绩: 评语: 装 订 (考试题目及要求) 嵌入式大作: 采用实验箱上的电位器作为信号输入 ...
- 从skyeye学习arm( 工具篇)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在前面的一篇文章中,我们介绍了如何利用skyeye启动最简单的arm程序代码.今天,我们可以从 ...
- arm linux 内核崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...
原创 宋宝华 Linux阅码场 2018-01-12 sysrq有多种功能,对于ARM Linux这种嵌入式没键盘的系统来说,也可以通过/proc/sysrq-trigger来进行操作. 实验平台:Q ...
- 我是穷人,可以不买开发板了吗?---QEMU 模拟arm系统
文章目录 序言 准备工作 QEMU开始 Linux内核 U-boot 的修改及编译 构建根文件系统 busybox配置安装 制作根文件系统 启动QEMU模拟arm开发板 出现的问题 结束语 序言 一直 ...
- arm linux死机不是崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...
sysrq有多种功能,对于ARM Linux这种嵌入式没键盘的系统来说,也可以通过/proc/sysrq-trigger来进行操作. 实验平台:QEMU模拟的ARM Linux 内核版本: # una ...
最新文章
- CentOS6 英文系统安装ibus
- WINCE6.0+S3C2443下的usb function(功能)驱动
- 2018~2019-11 20165107 网络对抗技术期末免考 Exp10 Final Powershell学习应用与渗透实践...
- 我们来研究一下Eureka的工作流程机制及相关原理
- Zephry_GPIO的中断使用详解以及中断原理
- Tensorflow官方文档学习理解 (二)
- php 汉字unico编码范围,汉字 Unicode 编码范围
- 千亿数仓第四章(指标计算_订单分析地域、分类维度分析业务开发)
- 2021宇哥八套卷总结—第三套试卷分析
- 2021-06-16 srm平台电子化采购的优势
- 原生JS活动倒计时实现思路
- 提问的智慧 - 艾瑞克.史蒂文.雷蒙德(Eric Steven Raymond)
- UDS之浅谈14 服务
- matlab ghm,matlab – 用Python中的matplotlib绘制许多数据点
- 浅谈Altera和Xilinx的FPGA区别
- Debian安装Python简要说明
- Before Anything, an Architect Is a Developer
- 必备小工具百度翻译桌面版,瞬时翻译
- 美股股票代码 A股 香港股票代码 上海股票代码 深圳股票代码csv
- 【390】向量叉乘,判断向量位置