接博文《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. C-整数划分

    将正整数 n 表示成一系列正整数之和, n=n1+n2+…+nk, 其中 n1>=n2>=…>=nk>=1 , k>=1 . 正整数 n 的这种表示称为正整数 n 的划分 ...

  2. 无法从“const char *”转换为“char *”

    写了如下的一段代码: const char *str; char *p=str; 提示错误: const char* 不能用于初始化char *类型的实体.这是为什么?我想应该是const char ...

  3. PHP - 使用pear的HTTP_Upload包进行上传

    前台代码: <html> <head> <title>上传文件</title> </head> <body> <form ...

  4. windows api 梳理

    PathMatchSpec Function Searches a string using a Microsoft MS-DOS wild card match type. Syntax BOOL  ...

  5. 第1章 软件测试基本概念(Week1,3月3日)

    一.对软件的认识 1. 什么是软件 2. 软件的分类 3. 软件开发的生命周期模型 (1)瀑布模型 (2)Scrum 其实对用瀑布模型这种臃肿不堪.要求严格.而无法适应软件开发周期变化的开发模型,渐渐 ...

  6. 基于visual Studio2013解决面试题之0901奇偶站队

     题目

  7. attachEvent和addEventListener详解

    attachEvent方法可以动态的为网页内的元素添加一个事件.通常你想为某个按扭添加一个单击事件时.你都会在按扭内写上onclick=事件名称.使用attachEvent则不必这样做.你把写好的事件 ...

  8. URAL 1180. Stone Game (博弈 + 规律)

    1180. Stone Game Time limit: 1.0 second Memory limit: 64 MB Two Nikifors play a funny game. There is ...

  9. asp.net2.0安全性(1)--用户角色篇(起篇)--转载来自车老师

    安全管理的解决方案在.net1.1中几乎为一片空白,对于应用程序的验证与授权大部分的工作是开发人员自己编写代码,或者是借助企业库等工具来实现,此可谓.net1.1中的一大缺憾.在.net2.0中微软为 ...

  10. 如何在SourceInsight中选中匹配的大括号中的内容

    如何在SourceInsight中选中匹配的大括号中的内容 要分析的代码很长,多个for,if等分析嵌套在一起,代码有点乱,找到了这个分支的头,却不知道尾在哪,找到了尾却不知道哪是开头,在网上找了一下 ...