2. KGDB 环境搭建(上):硬件准备与内核配置

KGDB 双机调试的核心思想是:目标机(Target) 运行被调试的内核,主机(Host) 运行 GDB 并通过串口或网线与目标机通信。本章聚焦于搭建这一物理与软件基础,确保后续调试会话能够稳定建立。

2.1 硬件连接方案对比

KGDB 支持两种物理链路:串口(RS-232) 和 以太网(UDP)。串口方案配置简单、兼容性最好,是入门首选;网线方案传输速度快,适合大内核映像调试。下表列出关键差异:

特性 串口(RS-232) 以太网(UDP)
连接线缆 交叉串口线(Null Modem) 交叉网线或直连交换机
最大波特率 115200 bps(常用) 100/1000 Mbps
内核配置选项 CONFIG_KGDB_SERIAL_CONSOLE CONFIG_KGDB_ETHERNET
调试稳定性 极高(无丢包) 高(依赖网络环境)
适用场景 嵌入式开发板、虚拟机 高性能服务器、远程调试
推荐选择: 本课程使用 串口方案,因为它不依赖网络协议栈,即使内核网络子系统崩溃,KGDB 仍能正常工作。若使用虚拟机,可在 VMware/VirtualBox 中添加“串行端口”并映射到主机命名管道或物理 COM 口。

2.2 目标机与主机操作系统要求

KGDB 对操作系统版本没有严格限制,但需要内核支持 KGDB 补丁或选项。以下是推荐环境:

  • 目标机(Target): Linux 内核版本 ≥ 2.6.26(原生支持 KGDB),推荐使用 Ubuntu 20.04+ 或 Debian 11+,内核版本 5.x 或 6.x。
  • 主机(Host): 任意 Linux 发行版(Ubuntu、Fedora、Debian 均可),安装 gdb、minicom 或 screen 等串口终端工具。
  • 架构要求: 目标机与主机架构可以不同(如 x86_64 调试 ARM64),但需要交叉编译工具链和对应架构的 GDB。
注意: 如果目标机是嵌入式板卡(如 Raspberry Pi、i.MX6),请确保板卡串口未被系统控制台独占。通常需要在内核 cmdline 中移除 console=ttyS0 或使用 kgdboc=ttyS0,115200 参数。

2.3 内核配置选项详解

KGDB 功能通过内核编译选项启用。以下是最核心的配置项及其作用:

配置选项 类型 说明
CONFIG_KGDB bool KGDB 核心支持,必须开启。启用后内核会包含 KGDB 调试 stub。
CONFIG_KGDB_SERIAL_CONSOLE bool 通过串口与主机通信。依赖 CONFIG_KGDB,是串口调试的必选项。
CONFIG_KGDB_KDB bool 启用 KGDB 的内核内建调试器 KDB,可在无主机时直接操作内核调试命令。
CONFIG_KGDB_LOW_LEVEL_TRAP bool 在异常处理早期捕获断点,用于调试非常早期的内核启动代码。
CONFIG_KGDB_TESTS bool 编译 KGDB 自测试框架,用于验证 KGDB 功能是否正常。
CONFIG_MAGIC_SYSRQ bool 启用魔术 SysRq 键,可通过 Alt+SysRq+g 手动触发 KGDB 断点。
配置建议: 对于串口调试,至少开启 CONFIG_KGDB、CONFIG_KGDB_SERIAL_CONSOLE 和 CONFIG_MAGIC_SYSRQ。如果希望在没有主机时也能调试,可额外开启 CONFIG_KGDB_KDB。

2.4 硬件连接与内核配置流程图

下图展示了从物理连接到内核配置的完整流程,帮助理解各环节的依赖关系:

KGDB 环境搭建流程(硬件 + 内核配置) 硬件准备 交叉串口线 / 网线 目标机 OS Linux 5.x / 6.x 主机 OS 任意 Linux 发行版 内核配置 make menuconfig 关键选项 CONFIG_KGDB CONFIG_KGDB_SERIAL_CONSOLE 编译内核 & 启动 提示 串口调试需确保 目标机串口未被占用

2.5 内核配置操作步骤

以下是在目标机内核源码目录中配置 KGDB 的典型步骤:

  1. 进入内核配置界面:
    make menuconfig
  2. 启用 KGDB 核心支持:
    路径:Kernel hacking → KGDB: kernel debugger
    按 Y 选中 [*] KGDB: kernel debugger。
  3. 启用串口控制台支持:
    路径:Kernel hacking → KGDB: kernel debugger → KGDB: use serial console
    按 Y 选中 [*] KGDB: use serial console。
  4. (可选)启用魔术 SysRq:
    路径:Device Drivers → Character devices → Magic SysRq key
    按 Y 选中 [*] Magic SysRq key。
  5. 保存并退出:
    按 → 选择 Save,然后 Exit。
验证配置: 保存后,检查 .config 文件是否包含以下行:
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_MAGIC_SYSRQ=y
如果缺少某项,请重新执行 make menuconfig 补选。

2.6 常见问题与避坑指南

  • 串口无响应: 检查串口线是否为交叉线(2-3 交叉,5-5 直连)。使用 minicom 或 screen 测试物理连通性。
  • 内核启动卡住: 如果目标机串口被控制台占用,KGDB 无法接管。在内核 cmdline 中添加 kgdboc=ttyS0,115200 并移除 console=ttyS0。
  • 主机 GDB 连接失败: 确认主机串口设备权限(如 /dev/ttyUSB0),使用 sudo chmod 666 /dev/ttyUSB0 或加入 dialout 用户组。
  • 虚拟机串口映射: 在 VMware 中,为虚拟机添加“串行端口”,选择“输出到命名管道”并设置 \\.\pipe\kgdb;主机使用 screen \\.\pipe\kgdb 连接。
快速验证: 目标机启动后,在主机执行 echo g > /proc/sysrq-trigger(需 root),如果目标机内核暂停并进入 KGDB 等待状态,说明环境搭建成功。