从skyeye学习arm(开篇)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 skyeye这个虚拟机工具,虽然之前听说过,但是很少使用。这次借着ubuntu环境,正好可以联系一下。基本的步骤也比较简单,无非就是搭建skyeye环境,下载arm编译环境,编译工程,加载等等。a)编译skyeye 此次我选择的版本是1.2.6版本。当然,如果你觉得麻烦也可以sud
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
skyeye这个虚拟机工具,虽然之前听说过,但是很少使用。这次借着ubuntu环境,正好可以练习一下。基本的步骤也比较简单,无非就是搭建skyeye环境,下载arm编译环境,编译工程,加载等等。
a)编译skyeye
此次我选择的版本是1.2.6版本。当然,如果你觉得麻烦也可以sudo apt-get install skyeye,但是一般下载的都是1.2.5版本。因为我想使用s3c2440作为我的测试平台,所以选择了高阶的版本。编译的过程也很简单,. /confiigure && make && make install。当中编译nandflash_smallblock.c可能有错误,只需要在519行的添加一个open的参数就可以了,一般为0666。
b)获取编译环境
搭建交叉编译环境是我们的基本工作。一方面,大家可以用buildroot工具自己编译,另一方面大家可以从www.arm9.net这边下载。
c) 获取工程代码
代码如果从头写,比较麻烦。我们可以借用skyeye1.3.5中的demo工程,四个文件,分别为汇编、c、makefile和linkfile。汇编如下,
#define MODE_SVC 0x13
#define I_BIT 0x80
.text
.align 4
.global begin
.type begin, function
begin:
/*disable I-bit*/
mov r0, #I_BIT|MODE_SVC
msr cpsr_c, r0
mov r1,#0xd2
sub r2,r0,r1
ldr sp, =irq_stack @ set sp_irq = irq_stack
bl hello
b begin
.data
.align 4
irq_stack:
.space 4096
C语言如下,
#define BOGO_MIPS 1000000
void hello(void)
{
int i;
char * hellostr="helloworld";
long* paddr=(long*)0xfffd001c;
int timeout ;
i = *hellostr - 'h';
while(1){
timeout = 0;
while(++timeout != BOGO_MIPS);
for(i=0;i<10;i++)
{
* paddr=hellostr[i];
}
}
return;
}
Makefile如下,
CC=arm-elf-gcc
LD=arm-elf-ld
CFLAGS= -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -mapcs-32 -march=armv4 -mtune=arm7tdmi
LDFLAGS= -N -p -X -Thello.lds
LIB=
all: hello
hello: start.o hello.o
$(LD) $(LDFLAGS) start.o hello.o -o hello
arm-elf-objdump -xS hello > hello.s
arm-elf-readelf -a hello > hello.r
arm-elf-nm hello > hello.n
start.o:start.S
$(CC) $(CFLAGS) start.S
hello.o:hello.c
$(CC) $(CFLAGS) hello.c
clean:
rm -rf *.o *.elf *.gdb hello *.r *.n *.s
链接文件如下,
OUTPUT_ARCH(arm)
ENTRY(begin)
SECTIONS
{
. = 0x1000000;
.text :
{
*(.text)
*(.rodata)
}
. = ALIGN(8192);
.data : {*(.data)}
.bss : {*(.bss)}
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_aranges 0 : { *(.debug_aranges) }
}
e) skyeye脚本,保存为skyeye.conf文件
#skyeye config file sample
arch:arm
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
uart:mod=term
#log: logon=0, logfile=./sk1.log, start=0, end=200000
f)执行,运行
有了工程和skyeye,一切都准备就绪。你要做的就是make工程, 然手skyeye -e hello就可以了。当然,如果你愿意,可以自己去编译一个gdb调试工具,这样可以和skyeye一起调试使用,效率更高。
更多推荐
所有评论(0)