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 硬件连接与内核配置流程图
下图展示了从物理连接到内核配置的完整流程,帮助理解各环节的依赖关系:
2.5 内核配置操作步骤
以下是在目标机内核源码目录中配置 KGDB 的典型步骤:
- 进入内核配置界面:
make menuconfig - 启用 KGDB 核心支持:
路径:Kernel hacking → KGDB: kernel debugger
按 Y 选中[*] KGDB: kernel debugger。 - 启用串口控制台支持:
路径:Kernel hacking → KGDB: kernel debugger → KGDB: use serial console
按 Y 选中[*] KGDB: use serial console。 - (可选)启用魔术 SysRq:
路径:Device Drivers → Character devices → Magic SysRq key
按 Y 选中[*] Magic SysRq key。 - 保存并退出:
按 → 选择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 等待状态,说明环境搭建成功。