D~DIDI~DIDIDI!!!!

0%

JTAG-SWD-DAP

概述

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
# Ubuntu/Debian
sudo apt-get install openocd

# macOS
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
# 使用 J-Link 连接 STM32F4
openocd -f interface/jlink.cfg -f target/stm32f4x.cfg

# 使用 ST-Link 连接 STM32
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg

# 使用 CMSIS-DAP 连接
openocd -f interface/cmsis-dap.cfg -f target/stm32f4x.cfg

# 指定 SWD 传输方式
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
# 连接到 OpenOCD 的 telnet 接口
telnet localhost 4444

# 常用命令
> halt # 停止目标
> resume # 恢复运行
> reset halt # 复位并停止
> reset run # 复位并运行
> reg # 查看寄存器
> mdw 0x08000000 16 # 读内存(32位,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 调试接口仅应用于授权的安全评估和合法的开发调试
  • 未经授权访问他人设备的调试接口可能违反法律
  • 生产设备应当禁用或保护调试接口以防止未授权访问
  • 如需进行安全研究,请确保在合法授权范围内进行

参考资料