概述
JTAG(Joint Test Action Group)、SWD(Serial Wire Debug)和 DAP(Debug Access Port)是嵌入式系统开发中最常用的调试和编程接口标准。它们为开发者提供了对微控制器和处理器内部状态的访问能力,是硬件调试、固件烧录以及安全研究中不可或缺的工具。
JTAG 接口
概述
JTAG 最初由联合测试行动小组(Joint Test Action Group)制定,后成为 IEEE 1149.1 标准。其核心是测试访问端口(TAP,Test Access Port),通过边界扫描(Boundary Scan)技术实现对芯片内部的调试访问。
接口信号
JTAG 接口使用以下信号来支持边界扫描操作:
| 信号名称 |
全称 |
方向 |
功能说明 |
| TCK |
Test Clock |
输入 |
测试时钟信号,同步内部状态机的操作 |
| TMS |
Test Mode Select |
输入 |
测试模式选择,在 TCK 上升沿采样以确定下一个状态 |
| TDI |
Test Data Input |
输入 |
测试数据输入,代表移入器件测试或编程逻辑的数据,在 TCK 上升沿采样 |
| TDO |
Test Data Output |
输出 |
测试数据输出,代表移出器件测试或编程逻辑的数据,在 TCK 下降沿有效 |
| TRST |
Test Reset |
输入 |
测试重置(可选),用于重置 TAP 控制器的状态机 |
TAP 状态机
JTAG 的核心是一个 16 状态的有限状态机,由 TMS 信号驱动:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Test-Logic-Reset → Run-Test/Idle ↓ ┌─── Select-DR-Scan ───┐ │ ↓ │ │ Capture-DR │ │ ↓ │ │ Shift-DR Select-IR-Scan │ ↓ │ │ Exit1-DR Capture-IR │ ↓ │ │ Pause-DR Shift-IR │ ↓ │ │ Exit2-DR Exit1-IR │ ↓ │ │ Update-DR Pause-IR │ │ └────────────────────────┘
|
常见 JTAG 引脚排列
| 引脚类型 |
引脚数 |
常见应用 |
| 标准 JTAG |
20 pin |
ARM 标准调试接口 |
| 紧凑 JTAG |
14 pin |
TI 等厂商的简化接口 |
| 迷你 JTAG |
10 pin |
ARM Cortex 调试连接器 |
SWD 接口
概述
SWD(Serial Wire Debug)是 ARM 公司设计的一种两线制调试接口协议,作为 JTAG 的替代方案。它仅使用两根信号线即可完成调试功能,大大减少了所需的引脚数量。
接口信号
| 信号名称 |
全称 |
功能说明 |
| SWDIO |
Serial Wire Data I/O |
双向数据线,用于传输调试命令和数据 |
| SWCLK |
Serial Wire Clock |
时钟线,由调试器提供 |
| SWO |
Serial Wire Output |
可选,用于跟踪数据输出(异步/Manchester) |
| nRESET |
System Reset |
可选,系统复位信号 |
SWD 与 JTAG 对比
| 特性 |
JTAG |
SWD |
| 信号线数 |
4-5 根 |
2 根(SWDIO + SWCLK) |
| 数据传输 |
半双工(TDI/TDO 分离) |
半双工(SWDIO 双向) |
| 菊花链连接 |
支持 |
不支持 |
| 引脚复用 |
TCK/SWCLK、TMS/SWDIO 可复用 |
- |
| 适用架构 |
通用 |
ARM Cortex 系列 |
| 调试速度 |
较快 |
快(开销更低) |
| 跟踪功能 |
需要额外引脚 |
通过 SWO 支持 |
DAP(Debug Access Port)
架构概述
DAP 是 ARM CoreSight 调试架构的核心组件,提供了对调试资源的统一访问接口:
| 组件 |
全称 |
功能 |
| DP |
Debug Port |
调试端口,连接外部调试器(支持 JTAG-DP 和 SW-DP) |
| AP |
Access Port |
访问端口,连接内部调试资源 |
| MEM-AP |
Memory Access Port |
内存访问端口,提供对总线的访问 |
| AHB-AP |
AHB Access Port |
AHB 总线访问端口 |
| APB-AP |
APB Access Port |
APB 总线访问端口 |
DAP 寄存器
| 寄存器 |
地址 |
功能 |
| IDCODE |
DP 0x0 |
器件识别码 |
| CTRL/STAT |
DP 0x4 |
控制/状态寄存器 |
| SELECT |
DP 0x8 |
AP 选择寄存器 |
| RDBUFF |
DP 0xC |
读缓冲区 |
| CSW |
AP 0x00 |
控制/状态字 |
| TAR |
AP 0x04 |
传输地址寄存器 |
| DRW |
AP 0x0C |
数据读写寄存器 |
常用调试工具
硬件调试器
| 调试器 |
支持接口 |
特点 |
| J-Link |
JTAG/SWD |
SEGGER 出品,功能全面,速度快 |
| ST-Link |
SWD/JTAG |
ST 官方调试器,性价比高 |
| DAPLink |
CMSIS-DAP |
开源调试器,基于 ARM CMSIS-DAP 协议 |
| Black Magic Probe |
SWD/JTAG |
开源,内置 GDB Server |
| Bus Blaster |
JTAG |
基于 FTDI,开源硬件 |
| Tigard |
JTAG/SWD/UART/SPI |
多协议开源工具,适合安全研究 |
软件工具
| 工具 |
说明 |
| OpenOCD |
开源片上调试器,支持多种调试协议和目标芯片 |
| pyOCD |
Python 编写的 ARM Cortex-M 调试工具 |
| JFlash |
J-Link 配套的烧录工具 |
| STM32CubeProgrammer |
STM32 官方编程工具 |
| Ozone |
SEGGER 出品的图形化调试器 |
OpenOCD 基本使用
安装
1 2 3 4 5 6 7 8 9 10 11 12
| sudo apt-get install openocd
brew install openocd
git clone https://github.com/openocd-org/openocd.git cd openocd ./bootstrap ./configure --enable-jlink --enable-stlink --enable-cmsis-dap make && sudo make install
|
连接目标
1 2 3 4 5 6 7 8 9 10 11
| openocd -f interface/jlink.cfg -f target/stm32f4x.cfg
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg
openocd -f interface/cmsis-dap.cfg -f target/stm32f4x.cfg
openocd -f interface/jlink.cfg -c "transport select swd" -f target/stm32f4x.cfg
|
基本调试命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| telnet localhost 4444
> halt > resume > reset halt > reset run > reg > mdw 0x08000000 16 > mww 0x20000000 0x12345678 > flash write_image erase firmware.bin 0x08000000 > flash verify_image firmware.bin 0x08000000 > bp 0x08001000 4 hw > rbp 0x08001000
|
安全研究应用
JTAG/SWD 接口在硬件安全研究中有重要应用:
| 应用场景 |
说明 |
| 固件提取 |
通过调试接口读取 Flash 中的固件进行逆向分析 |
| 调试分析 |
动态调试运行中的固件,分析加密算法和认证逻辑 |
| 绕过保护 |
研究读保护(RDP)、写保护机制的安全性 |
| 故障注入 |
通过电压/时钟毛刺攻击绕过安全检查 |
| 芯片识别 |
读取 IDCODE 识别未知芯片型号 |
⚠️ 安全提示:
- JTAG/SWD 调试接口仅应用于授权的安全评估和合法的开发调试
- 未经授权访问他人设备的调试接口可能违反法律
- 生产设备应当禁用或保护调试接口以防止未授权访问
- 如需进行安全研究,请确保在合法授权范围内进行
参考资料