Bootrom的调试方法(一)

来源:互联网 发布:人员优化的目的 编辑:程序博客网 时间:2024/06/08 06:55

 

一、        Bootrom的调试方法

 

当调试bootrombootrom_umcmp的时候,以下的这些是必须要进行调试的:

l        操作系统组建已经编译进来了.

l        镜像在ROMRAM中的地址.

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的未压缩版本看到更详细的分布。

 

再看看镜像是否再ROMRAM中的正确位置。

工具使用: 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对镜像进行反汇编。这个工具比较专业,还可以显示汇编代码流程图。

 

原创粉丝点击