· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [推荐] 江民安全专家永久免费 立即下载  RSA 2010
· [专题] 参与多核UTM调查 赢购物卡 谷歌遭攻击事件
· [IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 《拆弹部队》藏木马 看Xbox360与PS3背后秘密
· [热点] 报告:PDF漏洞远超微软 十款免费电子邮件程序

Linux内核分析 使用GDB和QEMU来调试

发布时间:2007.07.30 04:51     来源:赛迪网-技术社区    作者:pangzi

在对Linux内核分析的过程中,可以使用QEMU和GDB来进行调试。QEMU和GDB虽然能够实现源代码级的内核调试,但是还存在一个问题,就是当Linux内核允许中断时,单步命令(n与s)会进入时钟中断。通过浏览QEMU的源代码,大体把原因找了出来。单步命令(n与s)在gdb远程调试通讯协议中是s(参看info gdb),qemu的gdb stub在受到s命令后将虚拟CPU进入单步状态,但是在接收到s命令前,qemu的虚拟CPU是停止的(在等待gdb的命令)。这个时候,虚拟时钟计时并没有停止,所以,很可能在qemu的虚拟CPU还没开始的时候就需要触发时钟中断了,但是虚拟CPU还在停止状态,中断无法触发。接收到s命令后,虚拟CPU开始执行指令。如果内核允许中断,虚拟时钟就将触发中断,所以s命令执行一条指令后停止在时钟中断处理程序的开始处,而不是希望的函数中下一条指令处。

解决这个问题,需要修改gdb远程调试内核时单步命令的语义。

1.在gdb上修改。在处理用户的n与s命令时不是发送协议中的s命令,而是分两步。首先确定下一条指令的开始位置(或者下一行源程序对应的指令的开始位置)。对于有些RISC机器机器指令固定为某个长度,那么确定这个位置比较简单,但是对于像x86这样的变长指令的体系结构就需要稍微麻烦一点(需要确定当前指令的长度等)。然后假如第一步确定的地址是naddr。现在像处理用户的tbreak *naddr一样处理就可以了,接着发送继续运行命令c就可以了。

2.在qemu的gdb stub上修改协议命令s的处理方法。接收到s命令后不是让虚拟CPU进入单步执行状态,而是确定在没有中断的情况下,下一条指令的位置(注意对于当前是跳转指令的情况处理比较复杂),然后在这个位置设置临时断点,在虚拟CPU到达这个断点进入gdb stub后立即将其取消。


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 合作伙伴称戴尔将推出更多Linux平台电脑 (07-28) · NXP ARM9处理器 Linux系统智能机U900曝光 (07-27)
· 戴尔:Linux ATI驱动程序很不理想 必须改进 (07-26) · 轻轻松松 利用Wu-Ftpd快速打造FTP服务器 (07-25)
· Ubuntu创办人揭示Ubuntu Linux未来发展 (07-25) · 系统安全:分级防御对Linux服务器的攻击 (07-23)
· Linux环境下利用Sendmail架设Mail服务器 (07-23) · 《Linux管理员的网络基础》课程推介 (07-23)
· 深沉内涵 黑棕新色摩托RAZR 2 V9m曝光 (07-23) · Oracle与赛铁认证Veritas数据中心解决方案 (07-22)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
专题:联想财报成绩显著 净利1.53亿美元
·春节过后 互联网口水仗..
·专题:蓝光士气正旺 索..
·"2011谁最HOLD住创新评..
专题:热门TD智能手机大盘点
·专题:联想发布“个人云..
·专题:望眼欲穿 苹果发..
·2011通信展:二十载见证..
直播:中国LED产业年会论坛
·专题:服务器教育行业案..
·专题:回顾2009 原装耗..
·专题:HP Photosmart Pl..
NEC帮您打造智慧的城市
·保护企业私有云安全..
·华为AR G3系列企业路由..
·赛门铁克用户大会2011..
访问人数过多,请稍候访问