接博文《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. 在Delphi中开发使用多显示器的应用程序(MonitorCount和DefaultMonitor)

    Windows可以将多个显示器映射为虚拟桌面,使我们可以利用这一点设计出方便工作的应用程序.例如PowerPoint就充分发挥了双显示器的优势(大多数的笔记本电脑都支持),它可以在一个显示器上播放幻灯 ...

  2. listview滑动

    单击其中的一个item时,让这个item能滚动的listview的顶部.现在用 list.scrollTo(0, item.getTop()); 实现啦 android listview滚动到顶部 转 ...

  3. WPF Multi-Touch 开发:高效开发模式

    原文 WPF Multi-Touch 开发:高效开发模式 在前几篇文章中已经介绍了触屏操作的多种模式,并对其开发方式也有了进一步了解.细心的朋友应该会发现在上一篇文章中,如果拖动图片过快它会因惯性效果 ...

  4. 一步一步重写 CodeIgniter 框架 (1) —— url 如何映射到具体的方法

    CodeIgniter 框架最显著的特征就是 MVC 模式,它的做法就是提取 url 中的'分段', 映射到某个类的某个方法,从而由该方法来输出最终显示的页面内容.那么我们第一课中就是实现一个这样的原 ...

  5. Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)

    列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...

  6. Swift - 异步加载各网站的favicon图标,并在单元格中显示

    下面是一个简单的应用,表格视图的各个单元格自动异步加载各个网站的favicon图标,并显示出来. 主要是复习下如何自定义单元格,单元格中图片的异步加载,以及didSet的用法. 效果图如下: 操作步骤 ...

  7. Light OJ 1318 Strange Game 组合数+高速幂+分解因子

    长度为l的用k种字符组成的字符串有k^l中 当中m个字符要不同样 那就是k^l*C(l, m)*(k-1)^m 有反复 要除以2 可是你mod n了 不能直接除 n不一定是素数 所以不能乘以逆元 所以 ...

  8. Java:Java快速入门

    链接地址:http://www.cnblogs.com/happyframework/p/3332243.html 你好,世界! 源代码组织方式 Java程序由package+class组成,pack ...

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

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

  10. Codeforces 56D Changing a String 编辑距离 记忆dp

    主题链接:点击打开链接 编辑距离.,== 一边dp虽然录制前体累,,依然是dp #include<iostream> #include<cstdio> #include< ...