65.9K
CodeProject 正在变化。 阅读更多。
Home

英特尔(R) System Studio 开发者故事:使用英特尔® JTAG 调试器和 MinnowBoard MAX,如何在 Android-Linux-Kernel 中调试异常错误

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2015 年 5 月 21 日

CPOL

7分钟阅读

viewsIcon

9027

在本文中,我们将探讨如何在基于英特尔® 架构的系统上,使用英特尔® JTAG 调试器(作为英特尔 System Studio® 旗舰版工具的一部分),调试和检查 Android Linux 内核中的异常错误。

获取全新的英特尔® 物联网开发套件,这是一个完整的软硬件解决方案,使开发人员能够使用英特尔® Galileo 和英特尔® Edison 开发板创建令人兴奋的新解决方案。请访问英特尔® 物联网开发者专区

英特尔(R) System Studio 开发者故事:使用 XDB 和 MinnowBoard MAX,如何在 Android-Linux-Kernel 中调试异常错误。

在本文中,我们将探讨如何在基于英特尔® 架构的系统上,使用英特尔® JTAG 调试器(作为英特尔 System Studio® 旗舰版工具的一部分),调试和检查 Android Linux 内核中的异常错误。在此过程中,我们还将了解什么是 JTAG 和英特尔® JTAG 调试器,以及一些关于英特尔® 架构系统异常处理的信息。我们将使用 MinnowBoard MAX 作为基于英特尔® 架构的目标系统。

1. JTAG 概述

JTAG 是 Joint Test Action Group 的缩写,发音为 jay-tag,但通常指的是 IEEE std 1149.1-1990 IEEE 标准测试访问端口和边界扫描架构。该标准用于调试和测试 SoC(片上系统)和微处理器软件。

JTAG 调试的配置由三个部分组成:主机中的 JTAG 调试器软件、JTAG 探针和 SoC 中的片上调试 (OCD)。

1.1 JTAG 调试器软件

JTAG 调试器是主机中的一款软件工具。它从 JTAG 探针获取地址和数据并显示给用户,用户可以通过 USB 或其他 PC 连接方式向 JTAG 探针发送数据和地址,反之亦然。通过使用此工具,用户可以执行运行控制和源代码行调试,并加载映像的符号(二进制映像下载到目标系统)——例如运行、停止、单步进入、单步跳过、设置断点以及访问内存。因此,用户可以轻松调试目标系统的软件并检查系统内存和寄存器。英特尔 System Studio® 旗舰版包含用于主机端 JTAG 调试器软件的英特尔® JTAG 调试器(又称 XDB)。

1.2 JTAG 探针(或 JTAG 适配器)

JTAG 探针是一种硬件盒,它将 JTAG 信号转换为 PC 连接信号,如 USB、并行、RS-232、以太网。USB 是最常用的一种,许多 JTAG 探针都使用 USB 连接到主机 PC。尽管 JTAG 引脚数量有最小标准,但目标侧接口有许多变体——例如 ARM 10 引脚、ST 14 引脚、OCDS 16 引脚、ARM 20 引脚。本文中使用的英特尔® JTAG 调试器和 MinnowBoard MAX 配置具有与目标连接的 60 引脚连接。英特尔® ITP-XDP3 探针用作 MinnowBoard MAX 的 JTAG 探针。英特尔® JTAG 调试器还兼容来自其他供应商的 JTAG 探针,如 Macraigor® Systems usb2Demon®、OpenOCD。

1.3 片上调试(目标 SoC)

OCD 的主要组件是 TAP(测试访问点)和 TDI(测试数据输入)/ TDO(测试数据输出)。通过使用 TAP,我们可以重置或读/写寄存器和旁路,JTAG 的主要技术是边界扫描,通过 TDI/TDO 信号线(点击查看更多详情和图片)。

<图 1-1> JTAG 探针和目标系统的配置 - Lure 是用于英特尔® ITP-XDP3 和 MinnowBoard MAX 的小型引脚适配器。

2. 英特尔架构中的异常概述

异常是处理器在执行指令时检测到一个或多个预定义条件时生成的同步事件。
IA-32 架构指定了三类异常:故障、
陷阱和中止。通常,故障和陷阱是可恢复的,而中止不允许程序重新启动。发生异常时,其处理方式与中断处理相同。这意味着,在暂停并保存当前进程后,系统会切换到异常处理程序,并在异常处理完成后再次返回。


<表 2-1> 保护模式异常和中断

3. 准备 MinnowBoard MAX 和英特尔® ITP-XDP3,通过 USB 连接到主机 PC

您需要使用 Android 操作系统设置 MinnowBoard MAX。为此,请参阅“英特尔(R) System Studio 开发者故事:如何使用 VTune 配置、构建和剖析 Android Linux 内核”文章(请点击)。它介绍了 MinnowBoard MAX 以及如何在 MinnowBoard MAX 中设置/构建/下载 Android 操作系统。

将 MinnowBoard MAX 与引线(一块带有 60 针 JTAG 连接器的小型 PCB)连接到英特尔® ITP-XDP3 JTAG 探针,再将英特尔® ITP-XDP3 通过 USB 连接到主机 PC。主机 PC 应已安装英特尔® System Studio Ultimate Edition,以便获得英特尔® ITP-XDP3 的 USB 驱动程序。

<图 3-1> MinnowBoard MAX、英特尔® ITP-XDP3 JTAG 探针和主机 PC 上的英特尔® JTAG 调试器 (XDB) 的连接。

4. 使用英特尔® JTAG 调试器 (XDB) 调试 MinnowBoard MAX 上 Android 内核的异常。

我们将逐步介绍如何使用英特尔® JTAG 调试器检查和调试内核中的异常。

(1) 运行英特尔® JTAG 调试器:进入安装目录并运行批处理文件。(例如:start_xdb_legacy_products.bat)。

(2) 连接到目标:进入英特尔® JTAG 调试器菜单 - 文件 - 连接,并选择英特尔® ITP-XDP3 和 Z3680, Z37xx。

(3) 加载符号文件并设置源文件目录。进入英特尔® JTAG 调试器菜单 - 文件 - 加载/卸载符号,并设置符号文件。对于源文件,进入英特尔® JTAG 调试器菜单 - 选项 - 源目录,并设置规则和目录。规则用于调整当前源路径和符号文件中编译时记录的路径之间的文件目录。

(4) 浏览到包含异常处理程序的入口文件:英特尔® JTAG 调试器菜单 - 查看 - 源文件,并打开 entry_64.S 文件。

(5) 在异常入口点设置断点:找到 ENTRY(error_entry),它是带有 rax 寄存器中错误代码的异常入口点。每个异常处理程序都定义为 zeroentry 或 errorentry 宏,因此您可以在 error_entry 或某些特定的处理程序中设置断点。在本文中,我们使用 "zeroentry invalid_op do_invalid_op" 进行测试。

ENTRY(error_entry)
	XCPT_FRAME
	CFI_ADJUST_CFA_OFFSET 15*8
	/* oldrax contains error code */
	cld
	movq_cfi rdi, RDI+8
	movq_cfi rsi, RSI+8
	movq_cfi rdx, RDX+8
	movq_cfi rcx, RCX+8
	movq_cfi rax, RAX+8
	movq_cfi  r8,  R8+8
	movq_cfi  r9,  R9+8
	movq_cfi r10, R10+8
	movq_cfi r11, R11+8
	movq_cfi rbx, RBX+8
	movq_cfi rbp, RBP+8
	movq_cfi r12, R12+8
	movq_cfi r13, R13+8
	movq_cfi r14, R14+8
	movq_cfi r15, R15+8
	xorl %ebx,%ebx
	testl $3,CS+8(%rsp)
	je error_kernelspace
error_swapgs:
	SWAPGS
error_sti:
	TRACE_IRQS_OFF
	ret
<....>
zeroentry divide_error do_divide_error
zeroentry overflow do_overflow
zeroentry bounds do_bounds
zeroentry invalid_op do_invalid_op
zeroentry device_not_available do_device_not_available
paranoiderrorentry double_fault do_double_fault
zeroentry coprocessor_segment_overrun do_coprocessor_segment_overrun
errorentry invalid_TSS do_invalid_TSS
errorentry segment_not_present do_segment_not_present
zeroentry spurious_interrupt_bug do_spurious_interrupt_bug
zeroentry coprocessor_error do_coprocessor_error
errorentry alignment_check do_alignment_check
zeroentry simd_coprocessor_error do_simd_coprocessor_error

(6) 示例:制造一个异常并检查当设置断点时处理程序是否捕获到它:将断点设置到 "zeroentry invalid_op do_invalid_op" 并调用 BUG(),它通过 ud2 指令制造“无效操作码”故障。

#define BUG()							\
do {								\
	asm volatile("ud2");					\
	unreachable();						\
} while (0)
< 调用 BUG() >

您在内核的测试代码中添加 BUG() 宏以制造异常。(在本例中,我将其添加到 keyboard.c 中,通过特殊的按键输入序列制造异常。)

< 停在 Invalid_op 的断点处 >

您将断点设置在无效操作码的异常处理程序或异常处理程序的入口点。然后您可以看到并调试此异常的来源。

5. 结论

一些异常是系统硬件和软件的严重错误,因此了解这些异常发生的原因、时间和地点非常重要。通过使用英特尔® JTAG 调试器,您可以轻松检查并进一步调查这些问题。因为英特尔® JTAG 调试器提供了强大的功能,例如轻松访问汇编代码和源代码,以及检查调用堆栈和寄存器。

6. 参考文献

英特尔® 64 和 IA-32 架构软件开发人员手册

jtag 101 ieee 1149.x 和软件调试

Intel® 物联网开发者中心

立即开始创新!Intel® 物联网开发者计划提供知识、工具、套件以及专家社区,助您快速轻松地将您的创新想法转化为物联网解决方案。

使用适用于英特尔® Edison 和英特尔® Galileo 平台的英特尔® 物联网开发套件,构想、构建。这些套件是多功能、性能优化且完全集成的端到端物联网解决方案,支持各种编程环境、工具、安全性、云连接和硬件。

如需更多资源并了解新的 Intel® 物联网开发者套件 v1.0 如何帮助您简化物联网项目

© . All rights reserved.