接博文《Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)》。上篇博文中,仅简单介绍使用串口的Kgbd的流程(kgdboc方式),本文将重点介绍KGDB调试Linux内核的原理。内核版本在2.6.26以前的Linux,kgdb是通过补丁安装的,过程非常复杂,而且问题比较多.Linux内核从 2.6.26开始已经在内部集成kgdb,只需要配置kgdb并重新编译2.6.26(或更高)内核即可.使用kgdb调试需要两台机器,即主机和目标机(一般为开发板),两者通过串口线相连。要调试的内核编译需要配置支持kgbd,它跑在目标机上,主机上使用gdb通过串口线进行远程调试目标机上的内核。另外kgdb还支持网络方式(即kgdboe方式)进行远程调试内核,见本文第三部分。

/**********************************************************************************************************************************/

原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/9120483,作者:gqb666  


/**********************************************************************************************************************************/

一、KGDB原理:

   Kgdb相关源码主要实现了主机上gdb远程调试所需的功能,包括命令处理、陷阱处理以及串口通信3个主要部分。Kgdb会在Linux内核中添加一个调试stub,调试stub是Linux内核中的一小段代码,是运行gdb的开发机和目标机内核之间的媒介。gdb和调试stub之间通过gdb串行协议进行通信。Gdb串行协议是一种基于消息的ASCII码协议,包含了各种调试命令。当设置断点时,kgdb将断点的指令替换为一条trap指令,当执行到断点时控制权就转移到调试stub中去。此时,调试stub的任务就是使用远程串行通信协议将当前内核环境传送给gdb,然后从gdb处接收命令。gdb命令告诉调试stub下一步该做什么,当调试stub收到继续执行的命令时,将恢复内核的运行环境,把对cpu的控制权重新交还给内核。

二、KGDB功能部件:

   (1)GDB stub。

Gdb stub被称为调试插桩(简称为stub),是kgdb调试器的核心。它是Linux内核中的一小段代码,用来处理主机上gdb发来的各种请求;并且在内核处于被调试状态时,控制目标机上的处理器。

(2)陷阱处理。

当设置断点时,kgdb会提供一个异常处理函数,将断点位置的指令替换成一条异常指令。执行到该断点时该异常会发生,内核则将cpu控制权交给kgdb调试器,程序进入kgdb的提供异常处理函数中。在该异常处理函数中,可以分析内核代码的各种情况。

(3)串口通信。

Gdb和调试stub之间通过gdb串行协议进行通信。它是一种基于消息的ASCII码协议,包含了各种调试命令。

三、KGDBOE方式配置:(参阅博文Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)

最后要说的是除了使用串口外,也可以使用网卡进行通信,也就是kgdboe方式。kgdboe方式要比kgdboc方式优越,上篇kgdboc使用流程中也提到,当u-boot加载内核执行到 kgdb: Waiting for connection from remote gdb... 要手动关闭该串口,因为gdb远程连接时也需要此串口。那么带来的影响就是我们无法看到调试过程中内核的输出信息,而网卡(kgdboe)方式刚可以避免这一缺陷。下面简单介绍下网卡方式(kgdboe)的配置流程:

(1)配置内核:

a) CONFIG_NETCONSOLE (Networking support -> Network console logging support)

b) CONFIG_DEBUG_KERNEL (Kernel hacking -> Kernel Debugging)

c) CONFIG_KGDB (Kernel hacking -> KGDB)

d) CONFIG_KGDB_ETH (Kernel hacking -> KGDB -> Method of KGDB communication -> Ethernet)

(2)修改u-boot的启动参数bootargs以支持kgdb调试(与kgdboc类似)

setenv bootargs 'console=…kgdboe=[target-port]@<target-ip>/[dev][target-macaddr],[host-port]@<host-ip>/[dev] kgdbwait … nfsroot=…

举例:kgdboe=@192.168.1.4/,@192.168.1.3/

主要增加以上红色字体部分,解释下参数的意义:

  •     target-port (optional): GDB port (default 6443)
  •     target-ip: target ip address (i.e DVEVM ip address)
  •     dev (optional): network interface (default eth0)
  •     host-port (optional): Host port use to send/recieve UDP packets (default 6442)
  •     host-ip: Host IP address

(3)配置主机上的.gdbinit文件:

            在linux内核源码根目录下创建一个.gdbinit文件,其内容为:

  1. target remote udp:192.168.2.4:6443

(4)开始调试:

    开发板侧:

TI DaVinci EMAC: MAC address is deadbeaf
TI DaVinci EMAC Linux version updated 4.0
TI DaVinci EMAC: Installed 1 instances.
netconsole: not configured, aborting
kgdboe: local port 6443
kgdboe: local IP 192.168.1.4
kgdboe: interface eth0
kgdboe: remote port 6442
kgdboe: remote IP 192.168.1.3
kgdboe: remote ethernet address ff:ff:ff:ff:ff:ff
kgdboe: device eth0 not up yet, forcing it
kgdboe: debugging over ethernet enabled

主机侧:

 $arm-none-linux-gnueabi-gdb ./vmlinux
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi".
warning: The remote protocol may be unreliable over UDP
warning: some events may be lost, rendering further debugging impossible
0xc00533dc in breakpoint () at kernel/kgdb.c:1620
1620 atomic_set(&kgdb_setting_breakpoint,1);
(gdb)

Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置的更多相关文章

  1. Linux内核驱动学习(六)GPIO之概览

    文章目录 前言 功能 如何使用 设备树 API 总结 前言 GPIO(General Purpose Input/Output)通用输入/输出接口,是十分灵活软件可编程的接口,功能强大,十分常用,SO ...

  2. Android驱动开发之Hello实例

    Android驱动开发之Hello实例:   驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconf ...

  3. 基于msm8909高通平台Android驱动开发之hello程序

    本文转载自:http://www.itwendao.com/article/detail/227839.html Android驱动开发之Hello实例:   驱动部分 modified:   ker ...

  4. Linux 内核的文件 Cache 管理机制介绍

    Linux 内核的文件 Cache 管理机制介绍 http://www.ibm.com/developerworks/cn/linux/l-cache/ 1 前言 自从诞生以来,Linux 就被不断完 ...

  5. linux 内核驱动--Platform Device和Platform_driver注册过程

    linux 内核驱动--Platform Device和Platform_driver注册过程 从 Linux 2.6 起引入了一套新的驱动管理和注册机制 :Platform_device 和 Pla ...

  6. Linux内核驱动学习(八)GPIO驱动模拟输出PWM

    文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...

  7. linux内核驱动模型

    linux内核驱动模型,以2.6.32内核为例.(一边写一边看的,有点乱.) 1.以内核对象为基础.用kobject表示,相当于其它对象的基类,是构建linux驱动模型的关键.具有相同类型的内核对象构 ...

  8. Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...

  9. iOS-iPad开发之popoverController使用介绍

    iOS-iPad开发之popoverController使用介绍 iOS开发UI篇-popoverController使用注意 iOS SDK:自定义Popover(弹出窗口) 实现的简单例子: // ...

随机推荐

  1. Introduction to the Build Lifecycle

    Introduction to the Build Lifecycle Table Of Contents Build Lifecycle Basics Setting Up Your Project ...

  2. 利用内容提供者插入sms(装B程序)

    1.sms的权限配置 <uses-permission android:name="android.permission.READ_SMS"/> <uses-pe ...

  3. C#游戏框架uFrame

    C#游戏框架uFrame兼谈游戏架构设计 c#语言规范 阅读目录 1.概览 2.基本概念 3.依赖注入 4.Manager of Managers 5.利用UniRX实现响应式编程 6.研究总结 回到 ...

  4. 正确处理Windows电源事件

    简介为系统挂起与恢复而进行的应用准备步骤 曾几何时,当您正要通过应用提交或发布一些重要数据时,突然遇到一些急事需要处理,而且会耽误很长时间.当您完成任务回到电脑前时,发现电脑已经自动进入 了挂起状态, ...

  5. @Autowired 注释与@Qualifier 注释

    @Service("OrganDaoIbatis") public class OrganDaoIbatis extends BaseDao implements IOrganDa ...

  6. C++操作符的优先级

    C++操作符的优先级 C++操作符的优先级 操作符及其结合性 功能 用法 L L L :: :: :: 全局作用域 类作用域 名字空间作用域 ::name class::name namespace: ...

  7. 微软C#版SQLHelper.cs类

    转载自:http://blog.csdn.net/fengqingtao2008/article/details/17399247 using System; using System.Data; u ...

  8. GDI GDI+ 的区别

    GDI+是GDI的下一个版本,它进行了很好的改进,并且易用性更好.GDI的一个好处就是你不必知道任何关于数据怎样在设备上渲染的细节,GDI+更好的实现了这个优点,也就是说,GDI是一个中低层API,你 ...

  9. PHP学习之-1.7 注释

    注释 在PHP中也有注释语句:用双斜杠 "//" 来表示.其他语言中 HTML使用 "<!--  -->" ,CSS中使用 "/*     ...

  10. 在Centos 5.4上安装Mysql5.5.10 (整理以前的工作文档)

    1.     安装环境 1.1.  目的 安装Mysql5.5.10服务,提供公司XXXX测试环境.正式环境也采用该版本的mysql 1.2. 硬件环境 PC机:IntelE5300 内存4G 硬盘5 ...