Powerpc构架系统内核和内核模块调试.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Powerpc构架系统内核和内核模块调试

Powerpc构架系统内核和内核模块调试

类别:嵌入式系统

作者:易松华,华清远见嵌入式学院深圳中心讲师。说明:

此文档的目标系统为freescale MPC8349E-mITX,对其他采用POWERPC,MIPS,ARM的芯片的系统亦具有参考意义。此文档中内核调试为了简化,采用目标系

统中的UBOOT初始化目标板,并通过UBOOT或者BDI2000加载内核到目标板的RAM中。 1.BDI2000配置:下面是MPC8349E-mITX的BDI2000配置文件,; BDI-2000 Configuration file for the MPC8349E-mITX ; Tip: If after a reset, the BDI-2000 fails to halt at 0x100, ; you may need to power-down the board for a few seconds. [INIT] ; we use UBOOT to initialize the board [TARGET] CPUTYPE 8349 JTAGCLOCK 1 ;STARTUP RESET STARTUP RUN BREAKMODE HARD STEPMODE HWBP BOOTADDR 0x00000100 ;If you're getting "Writing to workspace failed" errors during flash operations, ;then try uncommenting this line instead. This moves the FLASH window

to ;high memory, leaving low memory available for DDR. RCW

0xb060a000 0x04040000 ;Set the HRCW to boot the image at 0xFE000000 MMU XLAT ;0xc0000000 PTBASE 0xf0 ; [HOST] IP 192.168.7.90 FILE $u-boot.bin LOAD MANUAL PROMPT 8349E-mITX-GP> DUMP

itx-dump.bin [Flash] CHIPTYPE AM29BX16 CHIPSIZE 0x800000 BUSWIDTH 16 ;WORKSPACE 0x1000 FORMAT BIN

0xfe000000 ;flash_image.bin is an image file of an entire 8MB

flash region. ;Flash this file at 0xfe0000000 to restore all of flash. ;ERASE 0xFE000000 0x10000 127 ; 127 sectors @ 64KB

each ;ERASE 0xFE7F0000 0x2000 8 ; 8 sectors @ 8KB each ;FILE $flash_image.bin ;Use these lines if you just want to flash U-

Boot ERASE 0xfe000000 0x10000? 4; Erase 384KB, each sector is

64KB FILE? mpc8349e/u-boot131-mitx-gp.bin [REGS] FILE $reg8349e.def 以上配置文件的【HOST】段的IP要改为主机IP,关键的

字段MMU XLAT 和PTBASE 是POWERPC和MIPS经常需要设置的,关于PTBASE的具体设置,超出本文范围,详细情况请参考BDI2000的手册 2.内核修改和配置为了能够调试内核,需要在内核中的Makefile中增加如下调试选

项:CFLAGS 增加C代码调试选项-g –ggdb AFLAGS 增加汇编代码调试选项:-Wa,-L -gdwarf-2 去掉CFLAGS编译选项中-fomit-frame-

pointer GCC的-fomit-frame-pointer选项是优化函数栈回溯(stack backtrace)的,我们调试的时候需要提供函数回溯能力,所以我们要去掉这个

选项,当然,有的系统系统不受它的影响,或者说它不起作用,为了统一,我

们统一去掉它。相对个案来说,我是做如下改动的:--- Makefile

2008-07-08 03:07:38.000000000 +0800 +++ Makefile.debug 2008-07-08 03:06:04.000000000 +0800 … -CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE) +ifdef CONFIG_DEBUG_INFO + + CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE) -g -ggdb -CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ + CFLAGS := $(CPPFLAGS) -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ -fno-strict-aliasing -fno-common -AFLAGS := -D__ASSEMBLY__ + AFLAGS := -

D__ASSEMBLY__ -Wa,-L -gdwarf-2 +else + CPPFLAGS := -

D__KERNEL__ $(LINUXINCLUDE) + CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ + -fno-strict-aliasing -fno-common

+ AFLAGS := -D__ASSEMBLY__ + +endif … @@ -491,27

+500,33 @@ # Defaults vmlinux but it is usually overridden in the arch makefile all: vmlinux -ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE -CFLAGS += -Os -else -CFLAGS += -O2 -endif include $(srctree)/arch/$(ARCH)/Makefile -ifdef CONFIG_FRAME_POINTER

-CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,) -else -CFLAGS += -fomit-frame-pointer -endif ifdef CONFIG_UNWIND_INFO CFLAGS += -fasynchronous-unwind-tables endif -ifdef CONFIG_DEBUG_INFO -CFLAGS += -g -endif +#ifdef CONFIG_DEBUG_INFO +CFLAGS += -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,)

+CFLAGS += -g -ggdb +CFLAGS += -O +#else + +# ifdef CONFIG_FRAME_POINTER + CFLAGS += -fno-omit-frame-pointer $(call

cc-option,-fno-optimize-sibling-calls,) +# else + CFLAGS += -fomit-frame-pointer +# endif + +# ifdef

CONFIG_CC_OPTIMIZE_FOR_SIZE + CFLAGS += -Os +# else + CFLAGS += -O2 +# endif + +#endif 通过以上修改后,系统的的调试信息简单的通过CONFIG_DEBUG_INFO宏来控制了,那么

CONFIG_DEBUG_INFO宏又是从哪里来的呢?它其实是从内核的配置文件.config

里面来的。一般内核通过make menuconfig做配置的时候,都有

Kernel hacking ---> [] Kernel debugging [] Compile the kernel with debug info [] Force gcc to inline functions marked 'inline' (2.6比较新的内核有这一项)[] Include BDI-2000 user context switcher (有的系统直接提供了这个选项,它和BDI2000的PTBASE设置配

合)通过保存后,以上选项会生成如下配置选项:

CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_INFO=y

CONFIG_FORCED_INLINING=y CONFIG_BDI_SWITCH=y 值得关注的是PowerPC内核中CONFIG_BDI_SWITCH,它到底在内核中怎样起作用的?我们看arch/powerpc/kernel/head_32.S的关键代码:… / Load up the kernel Context / 2: bl load_up_mmu #ifdef CONFIG_BDI_SWITCH / Add helper information for the Abatron bdiGDB debugger. We do this here because we know the mmu is disabled, and will be enabled for real in just a few instructions. / lis r5,

abatron_pteptrs@h ori r5, r5, abatron_pteptrs@l stw r5,

相关文档
最新文档