侵权投诉
订阅
纠错
加入自媒体

嵌入式Linux内核调试技术

2013-11-07 10:25
冷血の爱
关注

  近年处理器技术发展速度加快,嵌入式领域发生了翻天覆地的变化。特别是网络的普及,消费电子异军突起,嵌入式与互联网成为最热门的技术。在所有操作系统中,Linux是发展很快、应用很广泛的一种操作系统。Linux的开放性以及其他优秀特性使其成为嵌入式系统开发的首选。

  嵌入式系统开发所面临的问题

  嵌入式软件开发有别于桌面软件系统开发的一个显着的特点是,一般需要一个交叉编译和调试环境,即编辑和编译软件在主机上进行,编译好的软件需要下载到目标机上运行 ,主机和目标机之间建立起通讯连接,并传输调试命令和数据。由于主机和目标机往往运行着不同的操作系统,而且处理器的体系结构也彼此不同,这就提高了嵌入式开发的复杂性。

  总的来说,嵌入式开发所面临的问题主要表现在以下几个方面。

  涉及多种CPU 及多种OS

  嵌入式的CPU或处理器包括MIPS、PPC、ARM,XScale等不同的架构,这些处理器上运行的操作系统也有VxWorks、Linux、μC/OS、WinCE等多种。在一个企业之内,可能会同时使用好几种处理器,甚至几种嵌入式操作系统。如果需要同时调试多种类型的电路板,那复杂性是可想而知的。这也是我们选用瑞士Abatron公司的BDI2000的原因之一,它是一款功能强大的JTAG/BDM通用仿真器。它支持:PPC/MIPS/ARM/XSCALE/ CPU12/CPU32/M-CORE/ColdFire等多种处理器,支持Windows/Linux系统平台,以及多种第三方调试器,并且对Flash的烧写也很简单方便。

  开发工具种类繁多

  通常各种操作系统有各自的开发工具,在同一系统下开发的不同阶段也会应用不同的开发工具。如在用户的目标板开发初期,需要硬件仿真器来调试硬件系统和基本的引导程序,然后进行操作系统及驱动程序的开发调试。在调试应用程序阶段可以使用交互式的开发环境进行软件调试,在测试阶段需要一些专门的测试工具软件进行功能和性能的测试。在生产阶段需要固化程序及出厂检测等等。BDI2000可以适应开发的各个阶段,节约企业的支出和简化管理难度。

  对目标系统的观察和控制

  由于嵌入式硬件系统千差万别,软件模块和系统资源也多种多样,要使系统能正常工作,软件开发者必须要对目标系统具有完全的观察和控制能力,例如硬件的各种寄存器、内存空间、操作系统的信号量、消息队列、任务、堆栈等。

  此外,嵌入式系统变化更新比较快,对开发时间要求比较紧,需要一套功能强大的嵌入式软件集成开发工具,用于嵌入式软件开发的各个阶段。美国 Ultimate Solution公司的LinuxScope-JTD调试器是一个很好的选择,它专门用于配合BDI2000仿真器,特点是基于Eclipse的集成开发环境和插件技术;提供脚本定制功能实现目标机的特殊操作;提供Linux内核调试功能,容易修改和观察硬件寄存器;增强的MI接口可识别硬件断点及模块跟踪;具有标准调试特性;支持Linux应用程序的开发;以及Windows/Linux系统平台。

  嵌入式Linux内核的调试

  编译内核

  本文所调试的是MontaVista Linux,硬件是Intel Xscale PXA250。它拥有超过两千多用户和众多的MontaVista Linux产品在市场上销售,覆盖从智能手机、高清电视、机器人、无线网络设备到3G电信服务器等各种嵌入式应用。MontaVista Linux本身就是用BDI2000来开发调试的。

  进入内核源码目录下,即可配置完成相关选项并准备编译。配置时不要选中KGDB(软件基内核调试),否则会和BDI2000冲突。为了调试内核,需要在编译时加入调试信息,否则将无法看到源代码。修改内核源码根目录下的Makefile,在CFLAGS宏定义的末尾添加“–ggdb”选项,保存退出。这里加上gdb是为了更好的使代码适合gdb调试器,另外注意Makefile中的优化设置,有些时候优化会调整代码执行的顺序,在内核的调试阶段,不要加入优化选项。

  内核调试

  首先,配置BDI2000,确保目标机的正常初始化。通常来说,到了调试内核的阶段,电路板的boot程序应该是正常的,可以利用boot来完成目标机的初始化;另一种方式是通过BDI的配置文件来完成。

  接下来就是下载代码进行调试。如果代码已经固化,那仅下载调试信息给仿真器即可;否则需要把代码下载到RAM里运行,同时下载调试信息给仿真器。本文所用的是后一种方式。

  由于Linux运行之后会启动MMU而使地址重映射,因此第一个断点通常在函数start_kernel( ),而且只能设置为硬断点。硬件断点是非常有限的,有的处理器甚至只能设置一个。所以,在调试Linux内核时,使用普通的GDB进行断点设置会非常不方便。LinuxScope可以很方便的切换断点模式,并支持软断点,使断点的设置不再受到限制,为调试Linux内核提供强有力的支持。具体步骤如下:

  1) BDI配置文件的断点模式:soft

  2) LinuxScope配置默认的断点模式:soft /hard 都可以

  3) 用BDI下载压缩的内核:load 0x20000 zImage bin

  4) 把PC指针指到内核入口地址:ti 0x30000

  5) 运行LinuxScope,在start_kernel处设置硬件断点

  6) go,停下来后再设置软断点即可

  模块内核的调试

  我们使用BDI2000来调试Linux内核的另外一个重要原因,就是它可以支持调试内核模块。内核模块是一些可以让操作系统内核在需要时载入和执行的代码,这意味着它可以在不需要时由操作系统卸载。这种方式可以扩展操作系统内核的功能,而不需要重新启动系统,这一点对调试驱动程序的工程师特别有用。因为如果驱动程序编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以推荐使用模块方式。

1  2  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

电子工程 猎头职位 更多
文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码:

粤公网安备 44030502002758号