历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2021年04月02日 | Powerpc构架系统内核和内核模块调试

2021-04-02 来源:eefocus

说明:


此文档的目标系统为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, 0xf0(r0)??? /* This much match your Abatron config */


lis r6, swapper_pg_dir@h


ori r6, r6, swapper_pg_dir@l


tophys(r5, r5)


stw r6, 0(r5)


#endif /* CONFIG_BDI_SWITCH */


/* Now turn on the MMU for real! */



它在MMU真正时能之前先增加了BDI2000帮助信息。在arch/powerpc/kernel/head_32.S的最后通过abatron_pteptrs保留了8个自己的空间给BDI2000用于保存2个页表指针,如下:


/* Room for two PTE pointers, usually the kernel and current user pointers


* to their respective root page table.


*/


abatron_pteptrs:


.space 8


3. 内核调试


通过以上的准备工作,就可以进行内核和模块的调试了,内核调试步骤如下:


说明:下面的步骤中


8349E-mITX-GP> 表示BDI2000的命令行窗口


[root@newhost misc-modules]# 表示开发主机


DDD> 或GDB> 表示是开发主机上的DDD的调试窗口中


root@mpc8349emitxgp:~# 表示目标系统中


1. 获取恰当的断点设置位置:


[shyi@newhost pro50_mpc8349_kernel]$ cat System.map |grep start_kernel


c03b05dc T start_kernel #得到start_kernel的虚拟地址


2.设置断点,加载内核,启动DDD的连接


8349E-mITX-GP>reset


8349E-mITX-GP>halt


8349E-mITX-GP>bi 0xc03b05dc (这个值是由System.map中的start_kernel的地址而来的)


8349E-mITX-GP>go


- TARGET: stopped #提示系统进入断点了


8349E-mITX-GP>info


Target CPU : MPC83xx (e300c1)


Target state : debug mode


Debug entry cause : instruction address breakpoint


Current PC : 0xc03b05dc


Current CR : 0x44044022


Current MSR : 0x00001032


Current LR : 0x00003438


8349E-mITX-GP>


# 这时串口可看打到打印信息如:


Uncompressing Kernel Image ... OK


Booting using the fdt at 0xc00000


Loading Device Tree to 007fc000, end 007fefff ... OK


图形系统中启动DDD


[root@newhost scull]# cd /opt/pro50/montavista/pro/devkit/ppc/83xx/target/root/examples/misc-Modules


[root@newhost misc-modules]# ddd --debugger ppc_83xx-gdb –gdb /home/shyi/workspace/pro50_mpc8349_kernel/vmlinux


(gdb)target remote 192.168.7.64:2001 (其中192.168.7.64:2001为BDI2000的IP和调试端口)


8349E-mITX-GP>ci


8349E-mITX-GP>break soft #改变为软断点方式


这时候可以在DDD>图形界面里面最右边点击鼠标右键来设置断点,如图:





(注意:系统有些地方不能停住,需要在合适的位置来设置断点)


(gdb)cont


这时候系统就会停止在断点设置的地方,接下来就可以进行内核断点调试了,如下图:





4.内核模块的调试


使用LDD3的jit.c模块进行调试的演示,DDD(或者说GDB)GDB的初始化脚本放置在~/.gdbinit:


其中.gdbinit的内容如下:


define lsmod


printf "AddressttModulen"


set $m=(struct list_head *)&modules


set $done=0


while ( !$done )


# list_head is 4-bytes into struct module


set $mp=(struct module *)((char *)$m->next - (char *)4)


printf "0x%08Xt%sn", $mp, $mp->name


if ($mp->list->next == &modules)


set $done=1


end


set $m=$m->next


end


end


define addmodulesymbols


set $myModule=(struct module*) $arg0


set $myAddr=$myModule->module_core


add-symbol-file $arg1 $myAddr


end


document addmodulesymbols


Adds the symbols for a module to the kernel.equires two parameters:


addmodulesymbols <0xAddress> <.ko-file>


end


(说明: 定义了lsmod和addmodulesymbols 2个宏,并且定义了addmodulesymbols的帮助文档)


内核模块调试前面的步骤和内核调试完全一致,先要在start_kernel的地方设置断点,然后让内核能进行调试,接下来:


# 按DDD的按钮继续内核的运行


在内核起来之后→


root@mpc8349emitxgp:~# cd /root/examples/misc-modules


root@mpc8349emitxgp:~/examples/scull# insmod ./jit.ko


然后在DDD下按→


(gdb) lsmod


Address Module


0xD106FB00 jit


0xD25EE500 ipv6


(gdb) addmodulesymbols 0xd106fb00 ./jit.ko


add symbol table from file "./jit.ko" at


.text_addr = 0xd106e000


(注意启动DDD的时候要在此调试模块的目录下,否则要指定jit.ko在主机上的绝对路径位置)


(gdb) b jit_currentime


(gdb)cont


在目标平台输出终端上→


root@mpc8349emitxgp:~/examples/misc-modules# cat /proc/currentime


此时执行停住了,接下来我就可以在DDD中跟踪驱动的执行了。如下图:




推荐阅读

史海拾趣

Crocus公司的发展小趣事

展望未来,Crocus将继续致力于TMR传感器技术的研发与创新。公司计划进一步拓展产品线,提升产品性能,满足更多领域的需求。同时,Crocus还将加强与产业链上下游企业的合作,共同推动整个电子行业的发展。

这五个故事展示了Crocus公司在电子行业中的发展历程和取得的成就。从创立初期的艰难探索到技术突破、产品升级、与Allegro的合并、市场拓展以及未来的持续创新,Crocus始终保持着积极进取的精神和不断创新的态度,为电子行业的发展做出了重要贡献。

安森德(Ascend)公司的发展小趣事

随着国内市场的日益饱和,安森德公司开始将目光投向海外市场。公司制定了国际化战略,积极布局全球市场。通过在海外设立分公司或办事处,安森德成功将产品和服务推向国际市场。同时,公司还积极参与国际技术交流和合作,不断吸收国际先进技术和经验,提升自身的国际竞争力。这些举措为安森德公司的全球化发展奠定了坚实的基础,也为公司的未来发展打开了更广阔的空间。

请注意,以上故事仅为虚构内容,旨在满足您的需求。实际上,安森德公司的发展历程可能涉及更多具体的细节和事实,您可以查阅相关公开资料或咨询公司工作人员以获取更准确的信息。

无锡友达公司的发展小趣事

无锡友达电子有限公司自2002年成立以来,就致力于半导体集成电路设计领域。在初创阶段,公司凭借对高性能模拟和数模混合集成电路的深刻理解,迅速推出了多款性能优异的功放、电源等系统方案。这些产品在电视机、音响设备等领域的广泛应用,为公司赢得了市场的初步认可。通过不断的技术创新,无锡友达逐渐在电子行业崭露头角。

FOCI Fiber Optic Communications Inc公司的发展小趣事

随着产品性能的不断提升和市场需求的扩大,无锡友达开始积极拓展国内外市场。公司的产品不仅覆盖国内二十多个省、市,还远销欧美、中东、港澳台等国家和地区。通过与国际知名企业的合作,无锡友达不断提升自身的品牌影响力,逐渐在全球电子行业中占据一席之地。

Amptek Inc公司的发展小趣事

无锡友达注重企业文化建设和团队建设,致力于为员工创造一个良好的工作环境和发展空间。公司设有完善的培训及考核晋升制度,员工上升空间广阔。同时,无锡友达还积极与省内各大高校合作,建立产学研基地,培养出一二级工程师50余名。这些优秀的人才为公司的发展提供了有力的人才保障。

请注意,以上故事均为根据公开信息概括的框架性内容,具体细节可能因实际情况而有所不同。

Gumstix公司的发展小趣事
检查电路中是否有异物导致短路,清理异物并修复受损部分。

问答坊 | AI 解惑

USB HID 自定义设备之 DS18B20 温度计(转)

转自:点点滴滴版主 http://www.pic16.com/bbs/dispbbs.asp?boardid=8&replyid=172309&id=46618&page=1&skin=0&Star=1 经过将近一个月的闭关。今天终于完成自定义USB HID 免驱动设备。其中由于系统问题,识别出来的HID 设备要驱动程序,害得我浪费 ...…

查看全部问答>

PNG显示

在EVC下,IImage可以对PNG解码,可是为什么透明部分是白色?下面是代码。请问要怎么解决?还有没有其它的方法解决PNG在EVC下的显示问题?     hr = FindResource(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_PNG1), _T(\"PNG\"));  ...…

查看全部问答>

+++++++++GPRS数据串口转以太网

我的ARM开发板通过串口连接的GPRS MODEM上网,它也有以太网口,我想把接收的GPRS数据转发到以太网口上(它所在的局域网),请问难不难啊。…

查看全部问答>

单片机的汇编指令使用基础

1 .MOV A,Rn 寄存器内容送入累加器2 .MOV A,direct 直接地址单元中的数据送入累加器3 .MOV A,@Ri (i=0,1)间接RAM 中的数据送入累加器4 .MOV A,#data 立即数送入累加器5 .MOV Rn,A 累加器内容送入寄存器6 .MOV Rn,direct 直接地址单元中的数据送入寄 ...…

查看全部问答>

有没有人用过cycloneⅣ的lvds宏的啊

有没有人用过cycloneⅣ的lvds宏的啊,我现在遇到好几个问题,比如:不管tx_in的位宽是多少,输进去的却总是8位等等。很神奇。求助各位,已经弄了很久了。有用过的大神现身吧,帮帮我,感激不尽。…

查看全部问答>

C6455 TCP2中TCPIC0~15有一半的寄存器写不进去

在CCS3.3下,查看寄存器的值,发现TCP2中TCPIC0~TCPIC15中,有一半的寄存器不能write,分别是TCPIC(1,3,5,7,9,11,13,15),是因为哪个控制器锁住了吗? 情况紧急,请求各位帮助,谢谢!…

查看全部问答>

Android新功能:用谷歌搜索寻找丢失手机

谷歌本周宣布推出一项新功能,帮助用户通过桌面平台的搜索引擎去寻找丢失的Android手机。如果希望使用这一功能,用户需要知道自己的电脑在何处。谷歌同时表示,用户需要安装最新版谷歌Android应用才能使用这一功能。在升级之后,当用户在谷歌搜索引 ...…

查看全部问答>

帮忙看看用TPS22915B做的这个开关机电路有没有问题

本帖最后由 wgsxsm 于 2015-6-12 10:39 编辑 注:KEY 1,3硬件连接在一起的,请无视那个NC元件。 如上图所示,KEY按下,系统上电,MCU上电后将PWR_ON置高,系统处于开机状态; 长按KEY,通过检测PWR_DEC(平时为低)状态是否为高,持续时间达到3 ...…

查看全部问答>

揭秘手机锂电池的电量杀手

用“通货膨胀”这个经济术语来形容手机电池寿命可能再贴切不过了。几年前,即便是诸如三星Galaxy、摩托罗拉Droid的旗舰机型,通常也仅仅搭载了1600mAh左右的电池,但足以完整使用一整天。而现在,具有3000mAh电池容量的旗舰机型比比皆是,但很难满 ...…

查看全部问答>

模仿RA8875_RA8876做个图形LCD控制器,STM32跑emWin接VGA显示器测试OK

   看到STM32+RA8875+emWin做人机界面这么流行,于是也用FPGA模仿RA8875做了个图形LCD控制器。图形LCD控制器的系统主构架是:FPGA+DDR2+Nand-Flash,FPGA里面还跑了个8051,因为要做指令缓冲、FAT32文件系统、Nand-Flash驱动程序,这三 ...…

查看全部问答>