一、 Bootrom的调试方法
当调试bootrom和bootrom_umcmp的时候,以下的这些是必须要进行调试的:
l 操作系统组建已经编译进来了.
l 镜像在ROM和RAM中的地址.
l 运行时的情况.
当代码和makeflie中有大量的宏出现是,无法判断那些组件被包进来,可以使用#warning来确定那些组件被包含到操作系统中 ,用法如下:
把#warning We are within the expected conditional code加到代码中,当编译到这里时,编译器就会发出警告:
#ifdef LOCAL_MEM_AUTOSIZE
/* To Do Autosizeing stuff */
/* This BSP is not supporting Autosizing */
#warning We should NOT be in here.
#else /* not LOCAL_MEM_AUTOSIZE */
/* Don't do auto-sizing, use defined constants. */
#warning We should be here.
sysPhysMemSize = (char *)(LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE);
#endif /* LOCAL_MEM_AUTOSIZE */
Upon building the developer may see this:
ccppc -mcpu=603 -mstrict-align -ansi -O2 -fvolatile -fno-builtin -Wall -I/h -I. -
IC:/T22/ppc/target/config/all -IC:/T22/ppc/target/h -IC:/T22/ppc/target/src/config -
IC:/T22/ppc/target/src/drv -DCPU=PPC603 -DTOOL_FAMILY=gnu -DTOOL=gnu-c sysLib.c
sysLib.c:528: warning: #warning We should be here.
这个对不确定组件编译情况的时候比较有用。
Bootrom镜像的结构分析。
使用nm<arch> -n可以查看镜像内部数据段,文本段等的分布情况,
d:/target/config/wrSbc824x>nmppc -n bootrom
00100000 T _romInit
00100000 T _wrs_kernel_text_start
00100000 T romInit
00100000 T wrs_kernel_text_start
00100038 t cold
00100044 t warm
00100048 t start
001000a4 t ifpdr_value
00100230 t romInit824x
00100680 t romInvalidateTLBs
00100694 t tlbloop
001006a8 t romMinimumBATsInit
0010073c t gcc2_compiled.
0010073c T romStart
00100888 t copyLongs
0010090c t fillLongs
00100964 t gcc2_compiled.
00100964 t gcc2_compiled.
00100964 t memcpy
001009bc t bzero
00100a04 t adler32
00100bb8 t cksum
00100c6c t zcalloc
00100cbc t zcfree
00100d38 t huft_build
001013ec t inflate_trees_bits
00101480 t inflate_trees_dynamic
001015f8 t falloc
00101618 t inflate_trees_fixed
00101814 t inflate_trees_free
00101898 t inflate_flush
00101a70 t inflate_fast
00101e78 t inflate_codes_new
00101f00 t inflate_codes
0010272c t inflate_codes_free
00102764 t inflate_blocks_reset
0010284c t inflate_blocks_new
0010292c t inflate_blocks
001035f8 t inflate_blocks_free
00103678 t inflateReset
001036f4 t inflateEnd
00103780 t inflateInit
00103880 t zinflate
00103db4 T inflate
00104190 A _etext
00104190 D _wrs_kernel_data_start
00104190 A _wrs_kernel_text_end
00104190 A etext
00104190 D runtimeName
00104190 D wrs_kernel_data_start
00104190 A wrs_kernel_text_end
00104194 D runtimeVersion
00104198 D vxWorksVersion
0010419c D creationDate
001041a0 D _binArrayStart
001041a0 D binArrayStart
0010c190 T _SDA2_BASE_
001363d0 D _binArrayEnd
001363d0 D binArrayEnd
001363d0 d cplens
0013644c d cplext
001364c8 d cpdist
00136540 d cpdext
001365b8 d inflate_mask
001365fc d border
00136648 d fixed_built
0013664c d fixed_bl
00136650 d fixed_bd
00136654 d fixed_tl
00136658 d fixed_td
0013665c d buf
00136660 d nextBlock
00136664 D inflateCksum
00136670 A _edata
00136670 B _wrs_kernel_bss_start
00136670 A _wrs_kernel_data_end
00136670 A edata
00136670 b fixed_mem
00136670 B wrs_kernel_bss_start
00136670 A wrs_kernel_data_end
00137700 b intBuf
0013e660 D _gp
0013e668 D _SDA_BASE_
0014fda8 b c
0014fde8 b u
0014fe24 b v
001502a4 b x
001502f0 A _end
001502f0 A _wrs_kernel_bss_end
001502f0 A end
001502f0 A wrs_kernel_bss_end
在这里,开发人员可以知道各个段的地址分布情况。
001041a0 D _binArrayStart
001041a0 D binArrayStart
0010c190 T _SDA2_BASE_
001363d0 D _binArrayEnd
001363d0 D binArrayEnd
这个段里面的是压缩镜像。可以在bootrom_uncmp的未压缩版本看到更详细的分布。
再看看镜像是否再ROM和RAM中的正确位置。
工具使用: nm<arch> -n 和 objdump<arch> -D.
上面通过nmppc –n输出的内容,看到了一些关键字:.
00100000 T romInit – 开始在RAM运行的地址,必须是RAM_LOW_ADRS.
00104190 A etext – 文本段的结束
001041a0 D binArrayStart – 压缩镜像的开始地址
001363d0 D binArrayEnd – 压缩镜像的结束地址
00136670 A edata –数数据段结束地址
001502f0 A end – BSS段结束地址
在ROM中调用的代码都必须是位置无关的. 必需确定"end" 的地址是要小于RAM_HIGH_ADRS的值
使用objdump<arch>可以对镜像进行反汇编。
不过建议使用IDA Pro Advanced对镜像进行反汇编。这个工具比较专业,还可以显示汇编代码流程图。