问题描述:
小弟有1块开发板,里面有现成的Boot。CPU是是MPC852,上面跑vxworks5.5。
欲采用bootRom + vxworks image的方式,通过网口下载一个loadable vxWorks image进行开发。采用Tornado工具编译选项如下(RAM_LOW_ADR=0x10000):
得到一个vxWorks 映像文件。将此文件下载到开发板中,并执行得到,立刻出现异常,执行不下去。有如下提示信息:
Loading... vxworks
Starting at 0x10000...
Implementation Dependent Software Emulation
Exception current instruction address: 0x00010000
Machine Status Register: 0x00001000
。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。
r0 = a041dc sp = fd0e98 r2 = 0 r3 = 9000
r4 = 1000 r5 = 1 r6 = 2 r7 = faad0c
r8 = 40 r9 = ab0000 r10 = ffffffff r11 = fd0e98
r12 = 20002042 r13 = 0 r14 = 0 r15 = 0
r16 = 0 r17 = 0 r18 = 0 r19 = 0
r20 = 0 r21 = 0 r22 = 0 r23 = 0
r24 = 0 r25 = 0 r26 = 0 r27 = 0
r28 = 0 r29 = 10000 r30 = 0 r31 = fd0e98
msr = 1000 lr = a041ec ctr = 0 pc = 10000
cr = 20000084 xer = 0
出现异常“Exception current instruction address”的地址就是我将内核链接到的地址“0x00010000”,我的Tornado环境的宏定义如下:(注: 地址就在0x00010000)。
所以我怀疑我的内核文件被加载后,一执行就异常。
我再将vxWorks 映像文件反汇编,得到如下:
vxworks: file format elf32-powerpc
Disassembly of section .text:
00010000 <_sysInit>: //vxWorks加载后,跳到0x10000处欲执行的系统初始
//此处执行不下去了
10000: 3c c0 00 00 lis r6,0
10004: 38 c6 30 00 addi r6,r6,12288
10008: 90 66 00 00 stw r3,0(r6)
1000c: 7c 60 00 a6 mfmsr r3
10010: 54 64 04 5e rlwinm r4,r3,0,17,15
10014: 54 84 07 32 rlwinm r4,r4,0,28,25
10018: 54 84 06 b0 rlwinm r4,r4,0,26,24
1001c: 7c 80 01 24 mtmsr r4
10020: 4c 00 01 2c isync
10024: 3c 80 04 00 lis r4,1024
10028: 38 84 00 00 addi r4,r4,0
1002c: 7c 90 8b a6 mtspr 560,r4
10030: 7c 98 8b a6 mtspr 568,r4
10034: 3c 80 0a 00 lis r4,2560
10038: 38 84 00 00 addi r4,r4,0
1003c: 7c 90 8b a6 mtspr 560,r4
10040: 7c 98 8b a6 mtspr 568,r4
10044: 3c 80 0c 00 lis r4,3072
10048: 38 84 00 00 addi r4,r4,0
1004c: 7c 90 8b a6 mtspr 560,r4
10050: 7c 98 8b a6 mtspr 568,r4
10054: 7c 00 02 e4 tlbia
10058: 3c 80 3e 00 lis r4,15872
1005c: 3c a0 fa 40 lis r5,-1472
10060: 90 85 00 00 stw r4,0(r5)
10064: 3c 20 00 01 lis r1,1
10068: 38 21 00 00 addi r1,r1,0
1006c: 38 21 ff f0 addi r1,r1,-16
10070: 3c 60 00 00 lis r3,0
10074: 38 63 00 00 addi r3,r3,0
10078: 48 00 66 b4 b 1672c //跳到用户初始化阶段
0001007c <_sysMemProbeSup>:
1007c: 39 43 00 00 addi r10,r3,0
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
我怀疑是否是我编译环境的问题,可是我对编译环境没什么研究:
请大侠指点。
补充,整个编译过程如下:
wtxtcl D:\software\OS\Tornado2.2\host\src\hutils\configGen.tcl ..\BootableVxWorks.wpj
ccppc -c -g -mcpu=860 -ansi -fomit-frame-pointer -funroll-loops -fno-defer-pop -fstrength-
reduce -fno-builtin -P -xassembler-with-cpp -I.. -ID:\software\OS\Tornado2.2\target\config
\MPC852_bsp -ID:\software\OS\Tornado2.2\target\h -ID:\software\OS\Tornado2.2\target\config
\comps\src -ID:\software\OS\Tornado2.2\target\src\drv -DCPU=PPC860 -DTOOL_FAMILY=gnu -DTOO
L=gnu -DPRJ_BUILD -fvolatile D:\software\OS\Tornado2.2\target\config\MPC852_bsp\sysALib.s
-o sysALib.o
ccppc -c -g -mcpu=860 -ansi -fomit-frame-pointer -funroll-loops -fno-defer-pop -fstrength-
reduce -fno-builtin -I.. -ID:\software\OS\Tornado2.2\target\config\MPC852_bsp -ID:\softwar
e\OS\Tornado2.2\target\h -ID:\software\OS\Tornado2.2\target\config\comps\src -ID:\software
\OS\Tornado2.2\target\src\drv -DCPU=PPC860 -DTOOL_FAMILY=gnu -DTOOL=gnu -DPRJ_BUILD -fvol
atile D:\software\OS\Tornado2.2\target\config\MPC852_bsp\sysLib.c -o sysLib.o
ccppc -c -g -mcpu=860 -ansi -fomit-frame-pointer -funroll-loops -fno-defer-pop -fstrength-
reduce -fno-builtin -I.. -ID:\software\OS\Tornado2.2\target\config\MPC852_bsp -ID:\softwar
e\OS\Tornado2.2\target\h -ID:\software\OS\Tornado2.2\target\config\comps\src -ID:\software
\OS\Tornado2.2\target\src\drv -DCPU=PPC860 -DTOOL_FAMILY=gnu -DTOOL=gnu -DPRJ_BUILD -fvol
atile ..\prjConfig.c -o prjConfig.o
ccppc -c -g -mcpu=860 -ansi -fomit-frame-pointer -funroll-loops -fno-defer-pop -fstrength-
reduce -fno-builtin -I.. -ID:\software\OS\Tornado2.2\target\config\MPC852_bsp -ID:\softwar
e\OS\Tornado2.2\target\h -ID:\software\OS\Tornado2.2\target\config\comps\src -ID:\software
\OS\Tornado2.2\target\src\drv -DCPU=PPC860 -DTOOL_FAMILY=gnu -DTOOL=gnu -DPRJ_BUILD -fvol
atile ..\linkSyms.c -o linkSyms.o
vxrm ..\prjObjs.lst
Generating ..\prjObjs.lst...
ccppc -g -mcpu=860 -ansi -fomit-frame-pointer -funroll-loops -fno-defer-pop -fstrength-red
uce -fno-builtin -I.. -ID:\software\OS\Tornado2.2\target\config\MPC852_bsp -ID:\software\O
S\Tornado2.2\target\h -ID:\software\OS\Tornado2.2\target\config\comps\src -ID:\software\OS
\Tornado2.2\target\src\drv -DCPU=PPC860 -DTOOL_FAMILY=gnu -DTOOL=gnu -DPRJ_BUILD -c D:\so
ftware\OS\Tornado2.2\target\config\comps\src\version.c
ccppc -r -nostdlib -Wl,-X -Wl,@..\prjObjs.lst \
version.o -Wl,--start-group \
-LD:\software\OS\Tornado2.2\target\lib\ppc\PPC860\gnu -LD:\software\OS\Tornado2.2\target\
lib\ppc\PPC860\common -lcplus -lgnucplus -lvxcom -larch -lbridge -lcommoncc -ldcc
-ldot1x -ldrv -lem -lepcommon -lepdes -lfirewall -lgcc -lipsec -lnat -lnet -lo
s -lospf -lppp -lradius -lrpc -lrwcommon -lsnmp -ltffs -lusb -lvxfusion -lvxmp
-lvxsnmp -lvxvmi -lwdb -lwind -lwindview -lwlan D:\software\OS\Tornado2.2\target\lib\
libPPC860gnuvx.a -Wl,--end-group -o partialImage.o
nmppc partialImage.o @..\prjObjs.lst | wtxtcl D:\software\OS\Tornado2.2\host\src\hutils\mu
nch.tcl -c ppc > ctdt.c
ccppc -c -fdollars-in-identifiers -g -mcpu=860 -fomit-frame-pointer -funroll-loops -fno-de
fer-pop -fstrength-reduce -fno-builtin -I.. -ID:\software\OS\Tornado2.2\target\config\MPC8
52_bsp -ID:\software\OS\Tornado2.2\target\h -ID:\software\OS\Tornado2.2\target\config\comp
s\src -ID:\software\OS\Tornado2.2\target\src\drv -DCPU=PPC860 -DTOOL_FAMILY=gnu -DTOOL=gnu
-DPRJ_BUILD ctdt.c -o ctdt.o
ccppc -g -mcpu=860 -ansi -fomit-frame-pointer -funroll-loops -fno-defer-pop -fstrength-red
uce -fno-builtin -I.. -ID:\software\OS\Tornado2.2\target\config\MPC852_bsp -ID:\software\O
S\Tornado2.2\target\h -ID:\software\OS\Tornado2.2\target\config\comps\src -ID:\software\OS
\Tornado2.2\target\src\drv -DCPU=PPC860 -DTOOL_FAMILY=gnu -DTOOL=gnu -DPRJ_BUILD -c D:\so
ftware\OS\Tornado2.2\target\config\comps\src\dataSegPad.c
ldppc -X -N -e _sysInit -Ttext 00010000 \
dataSegPad.o partialImage.o ctdt.o \
-T D:\software\OS\Tornado2.2\target\h\tool\gnu\ldscripts\link.RAM -o vxWorks
D:\software\OS\Tornado2.2\host\x86-win32\bin\vxsize ppc -v 00200000 00010000 vxWorks
vxWorks: 556272(t) + 28288(d) + 35616(b) = 620176 (1411440 unused)
Done.
执行第一条指令就异常,这个有些奇怪,按道理说不应该啊。
你在boot的命令行中用l将VxWorks加载到内存,然后再d 0x10000,检查一下第一条指令是不是
3c c0 00 00 (lis r6,0)
我先用 l 将VxWorks加载到内存,然后再d 0x10000。出现下面的提示信息:
。。。。。。。。。。。。。。
Attaching network interface lo0... done.
Loading... vxworks.bin
entry = 0x10000
[VxWorks Boot]: d 0x10000
010000: 7f45 4c46 0102 0100 0000 0000 0000 0000 *.ELF............*
010010: 0002 0014 0000 0001 0001 0000 0000 0034 *...............4*
010020: 000b 9ea4 8000 0000 0034 0020 0001 0028 *.........4. ...(*
010030: 000d 000a 0000 0001 0000 0060 0001 0000 *...........`....*
010040: 0001 0000 0008 eb70 0009 7690 0000 0007 *.......p..v.....*
010050: 0000 0010 0000 0000 0000 0000 0000 0000 *................*
010060: 3cc0 0000 38c6 3000 9066 0000 7c60 00a6 *<...8.0..f..|`..*
010070: 5464 045e 5484 0732 5484 06b0 7c80 0124 *Td.^T..2T...|..$*
[VxWorks Boot]:
请大侠指点。尤其是 phenix_yw2 凤凰大侠。
所以啊,你0x10000地址处根本不是可执行的指令,而是ELF头,你的入口程序其实是在0x10060处!
boot启动后通过网络将VxWorks映像下载到内存,你应该将ELF的头剥掉,将可执行段代码拷贝到0x10000处,然后再go 0x10000.
你可以使用bootLoadModule (fd, pEntry)函数, 执行后,pEntry即为VxWorks入口地址可以从那执行。
ps:我也是新手,不是什么大侠,大家多多交流,呵呵~
bootloader加载ce/mobile的流程和这差别很大么?
其实是因为生成的内核是ELF格式的文件,楼主可以看看是不是在选择编译vxWorks内核的时候某些选项有点问题?或者用elfToBin这个工具转换一下试试看。
谢谢大家。按照phenix_yw2提供的方式,问题解决。结贴。