[VxWorks] 为什么我的vxWorks内核无法执行,下载到板上,执行就有异常,请大侠指点

badapple628   2010-1-25 23:03 楼主
问题描述:
        小弟有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
   。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

        我怀疑是否是我编译环境的问题,可是我对编译环境没什么研究:


请大侠指点。

回复评论 (12)

补充,整个编译过程如下:

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.
点赞  2010-1-25 23:06
帮顶下。

MARK.
点赞  2010-1-25 23:42
帮顶下。
点赞  2010-1-26 19:02
执行第一条指令就异常,这个有些奇怪,按道理说不应该啊。

你在boot的命令行中用l将VxWorks加载到内存,然后再d 0x10000,检查一下第一条指令是不是
  3c c0 00 00 (lis r6,0)

点赞  2010-1-26 22:53
终于有牛人相助了.谢谢.
点赞  2010-1-27 12:48
我先用 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 凤凰大侠。
点赞  2010-1-27 19:05
所以啊,你0x10000地址处根本不是可执行的指令,而是ELF头,你的入口程序其实是在0x10060处!

boot启动后通过网络将VxWorks映像下载到内存,你应该将ELF的头剥掉,将可执行段代码拷贝到0x10000处,然后再go 0x10000.

你可以使用bootLoadModule (fd, pEntry)函数, 执行后,pEntry即为VxWorks入口地址可以从那执行。

ps:我也是新手,不是什么大侠,大家多多交流,呵呵~
点赞  2010-1-27 21:14
   好的。多多交流。你的答复对我很有帮助,谢谢。
点赞  2010-1-27 21:57
引用: 引用 7 楼 phenix_yw2 的回复:
所以啊,你0x10000地址处根本不是可执行的指令,而是ELF头,你的入口程序其实是在0x10060处!

boot启动后通过网络将VxWorks映像下载到内存,你应该将ELF的头剥掉,将可执行段代码拷贝到0x10000处,然后再go 0x10000.

你可以使用bootLoadModule (fd, pEntry)函数, 执行后,pEntry即为VxWorks入口地址可以从那执行。

ps:我也是新手,不是什么大侠,大家多多交流,呵呵~

ce/mobile和vx的差别这么大呀
点赞  2010-1-28 18:49
bootloader加载ce/mobile的流程和这差别很大么?
点赞  2010-1-29 18:51
其实是因为生成的内核是ELF格式的文件,楼主可以看看是不是在选择编译vxWorks内核的时候某些选项有点问题?或者用elfToBin这个工具转换一下试试看。
点赞  2010-2-1 19:27
谢谢大家。按照phenix_yw2提供的方式,问题解决。结贴。
点赞  2010-3-23 19:54
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复