制作USB3.0调试线调试windows10内核

引子

感觉自从Apple推出了macbook之后,现在的轻薄笔记本上的接口越来越少,以前想在物理机上调试内核只要插上串口线就可以了,而现在的笔记本上别说串口了,连usb type A接口都快要所剩无几了。

比如我手头的这台

整个机器只有这四个接口,一个AUX,一个usb3.0 type-A,两个usb3.0 type-C。

制作

看来只能试试usb调试了,好在微软的文档非常全很容易就可以查到相关信息。 微软的文档是这么说的:

Debugging Tools for Windows supports kernel debugging over a USB 3.0 cable. This topic describes how to set up USB 3.0 debugging manually.

The computer that runs the debugger is called the host computer, and the computer being debugged is called the target computer.

Debugging over a USB 3.0 cable requires the following hardware:

A USB 3.0 debug cable. This is an A-A crossover cable that has only the USB 3.0 lines and no Vbus.

On the host computer, an xHCI (USB 3.0) host controller

On the target computer, an xHCI (USB 3.0) host controller that supports debugging

所以想用usb3.0调试需要一些硬件要求。要一个只包含usb3.0的线并且没有vbus的A-A的交叉线,调试机要有xhci usb3.0控制器,靶机上要有支持调试的xhci usb3.0控制器。

首先检查了一下靶机和调试机上确定有xhci usb3.0控制器,一般这么新的机器上都应该有。

基本上设备管理器里有这东西基本问题不大。

或者使用usbview查看

然后就是制作A-A的调试线了。

首先去买一条usb3.0 A-A的交叉线,很便宜大概10块左右的样子。

比如这种九块九包邮的就很好。

然后重点的是搞清楚啥叫 only the USB 3.0 lines and no Vbus 搜了一下usb3.0的引脚定义,就用维基百科上看到的这个试一下吧。

USB 3.0[1],其USB速率模式称为“Super Speed”,是通用序列总线(Universal Serial Bus,USB)的第三个主要修订版本。其主要技术标准有:支持全双工,并采用发送列表区段来进行数据发包,供电标准为900mA,且理论上有支持光纤传输的潜力,传输速度为5Gbit/s。USB 3.0的设计兼容USB 2.0与USB 1.1版本,并采用三级多层电源管理技术,可以为不同设备提供不同的电源管理方案。

USB 3.0采用新的数据包路由传输技术,线缆设计8条内部线路,除VBus和GND作为电源提供线外,剩余3对均为数据传输线路其中保留D+与D-两条兼容USB 2.0的线路,新增SSRX与SSTX专为新版所设的线路,因此USB 3.0比USB 2.0多了数个触点。USB 3.0的Standard-A接口继续采用与早先版本一样的尺寸方案,外观以蓝色区分,只是内部触点有变化,新的触点将会并排在当前4个触点的后方。引入展频时脉技术,降低电磁辐射的逸散。

根据维基百科的描述,里面应该有根红色的线是vbus用的(虽然不明白vbus是个啥东西,但感觉像是供电的),然后D- D+是兼容usb2.0的。好的,按照微软的要求,only the USB 3.0 lines and no Vbus 意思就是这些统统都不要,切掉红色、白色、绿色就行了。

弄清楚怎么搞以后就可以开工了。 选一种你喜欢的工具把USB线剥开(最好不要选中间的位置,因为太丑了),切开屏蔽层(就是外面那些金属网)就能看到那三根线了,其他的是usb3.0的线束被分别包裹着,不要去动它们,果断剪断红、绿、白就好了。

这里建议大家不要买太便宜的线,因为哪些便宜货搞不好拆开以后会发现线的颜色都是胡乱用的。😂

然后连接调试机和靶机试一下,如果顺利的话两边都会识别出新设备。

靶机端的操作: 用usbview查看,如果出现这样的port说明是正常的。 重点看user connectable和debug capable都是yes。

然后记下这个port所在的usb xHCI主控制器的Bus.Device.Function号

类似a.b.c这样子的一个东西。

最后开启调试,以管理员权限执行下面的命令

bcdedit /debug
bcdedit /dbgsettings usb targetname:TargetName
bcdedit /set "{dbgsettings}" busparams a.b.c

其中targetname有一些诡异的命名要求

  1. 长度24个字符
  2. 只能用数字字母下划线和连字符,意思就是[a-zA-Z0-9_-]{1,24}
  3. 不能包含debug字样在里面,debug、Debug、DeBuG总之这5个字母连在一起各种组合都是不行的,不区分大小写。

busparams后面跟的a.b.c就是你的debug port所在的xhci控制器的Bus.Device.Fucntion。 然后先别忙着重启。

调试机端的操作: 首先用usbview查看端口上是否识别出来设备

在调试机端需要用管理员权限运行windbg,然后设置内核调试. 这里写之前在靶机上设置的targetname. 确认后控制台会有输出

Waiting to reconnect...
USB: Write opened

这时候重启靶机,当第一次连接后调试机上会安装驱动,然后会出现一个叫USB Debug Connection Device的设备。

之后便连接成功可以调试了。

Connected to Windows 10 18362 x64 target at (Wed Nov  6 14:31:58.853 2019 (UTC + 8:00)), ptr64 TRUE
Kernel Debugger connection established.

************* Symbol Path validation summary **************
Response                         Time (ms)     Location
Deferred                                       SRV*T:\windev\sym*http://msdl.microsoft.com/download/symbols
Symbol search path is: SRV*T:\windev\sym*http://msdl.microsoft.com/download/symbols
Executable search path is: 
Windows 10 Kernel Version 18362 MP (1 procs) Free x64
Built by: 18362.1.amd64f[制作USB3.0调试线调试windows10内核](media/15730081931338/%E5%88%B6%E4%BD%9CUSB3.0%E8%B0%83%E8%AF%95%E7%BA%BF%E8%B0%83%E8%AF%95windows10%E5%86%85%E6%A0%B8.md)re.19h1_release.190318-1202
Machine Name:
Kernel base = 0xfffff805`68e00000 PsLoadedModuleList = 0xfffff805`69248210
System Uptime: 0 days 0:00:00.419

注意事项

一定要注意xHCI控制器的Bus.Device.Function,在设置过busparams参数之后就只能用这个控制器下的port,如果你的靶机上有多个xHCI控制器则表现为不是所有的usb口都可用。

只有type-C口怎么办?

使用一根type-A转type-C的转接线就可以了,亲测有效。