本文根据《软件调试(第2版)》卷1:硬件基础“第七章 JTAG 调试”编写。建议有兴趣的朋友购买一本来学习。对于 Firmware 工程师来说,从底向上学习是一个很好的方向。

现在的X86变得日益复杂,如何进行有效的Debug 也日渐成为一个难题。为此 Intel 在芯片组或者 CPU 上预留了一个称作DCI (Intel® Direct Connect Interface)的Debug 接口。这个接口使用 USB 3.0一模一样的外部连接。CPU 内部有切换器,当Chipset 发现外部有设备和他握手,就将原本的USB信号切换为DCI 的信号。这样无需额外的预留就能实现Debug。

在DCI 出现之前,Intel 使用J-Tag 接口。当时的 Debug 盒子是下面这样,叫做 In-Target Proble,简称 ITP。  当年价格在 3000刀,现在好像没有这么贵了。之前我在的公司买了一个,老板恨不得把它供起来,一年也用不到几次。最后不知道什么原因它的适配器坏掉了。我去询问价格,得到的答案是适配器90刀,然后90天发货........当然对方也很nice 的告诉我可以去中关村配一个电压相同功率差不多的也能用。后来回报上去之后老板左右不定,不想花钱和时间又怕损坏.........最终这个设备束之高阁了。

图片来自【参考1】

为了Debug,主板上同时必须预留下面这样的 J Tag 接口。显而易见,说服HW工程师在主板上预留这样的接口需要花费极大的口舌,至于说服老板在量产板子上焊接这样的接口几乎是不可能的事情。因此,串口一直是BIOS工程师的最爱。

图片来自【参考2】

现在的Debug 盒子长得是下面这样,全称是“Intel SVT Closed Chassis Adapter”,缩写 “CCA”(Intel Silicon View Technology Closed Chassis Adapter),价格390刀。更通俗称作“DCI 蓝盒子”。通过这个设备可以绕开 CPU 直接和硬件打交道。这样,当 CPU 出现问题的时候,比如:CPU Hang了,工程师有机会来读取一些寄存器值…….

来自【参考3】

除此之外还有长得类似 WinDBG 线的 DbC( debug class ) 线,同样是插在 USB 3.0 口上就能进行Debug。

图片来自参考4

相比前面的 CCA ,可以看出 DBC 更见简单便宜,但是在Debug 的时候可能会出现无法连接的情况,比如停得太早或者 XHCI 出现问题直接死掉了。因此,如果有可能尽量首选 CCA。

上述设备的典型应用如下(来自文章开始提到的《软件调试》 7.4.7)

正如本章开头所说的,硬件调试工具通常用来解决软件调试器难以解决的问题,以下是使用 JTAG 方式调试的一些典型场景。

(1)调试系统固件代码,包括BIOS代码,EFI代码以及支持AMT技术的ME(Management Engine)代码。

(2)调试操作系统的启动加载程序(Boot Loader),以及系统临界状态的问题,比如进入睡眠和从睡眠状态恢复过程中发生的问题。

(3)软件调试器无法调试的其他情况,比如开发软件调试器时调试实现调试功能的代码(例如Windows的内核调试引擎),以及调试操作系统内核的中断处理函数,任务调度函数等。

(4)观察CPU的微状态,比如CPU的ACPI 状态(C State)。

作为BIOS工程师难得申请一些设备,所以如果有可能尽量申请一个。毕竟“工具善其事,必先利其器”,工具简单直观能省去很多麻烦。

参考:

  1. https://habrahabr.ru/company/pt/blog/341946/
  2. https://minnowboard.org/add-ons/debugger-lure
  3. https://designintools.intel.com/Silicon_View_Technology_Closed_Chassis_Adapter_p/itpxdpsvt.htm
  4. https://designintools.intel.com/product_p/itpdciamcm1mu.htm

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>