使用 KDNET 设置 2PF 内核模式调试

通过对 PCI 配置空间进行分区,Windows 调试工具支持使用多个物理功能 (PF) 在受支持的 NIC 上通过网络电缆进行内核调试。

通过 2PF 调试,每个 PF 都可以连接到单个网络端口,因此它允许内核调试功能连接到一个 PF,而标准网络堆栈与另一个 PF 通信。 因此,KDNIC 不需要通过 KDNET 路由 Windows 网络流量,KDNET 将只负责路由主计算机内核调试器流量。 这导致性能显著提高。

本主题介绍如何使用 kdnet.exe 实用工具设置 2PF 调试。

鼓励网络卡供应商启用对此功能的支持。 有关详细信息,请参阅调试器 2PF KDNET 微型端口网络驱动程序支持

两个驱动程序将在分区的 PCI 配置空间上运行

  • Windows 收件箱驱动程序将在 bus.dev.fun0.0 PCI 位置用完主网络端口。

  • KDNET-Ext. 模块将在 bus.dev fun0.1 用完添加的 PF,此技术可确保 Windows 收件箱 NIC 驱动程序不会受到与 KDNET 共享 NIC 的影响。

运行调试器的计算机称为主计算机,正在调试的计算机称为目标计算机

内核模式 2PF 设备要求

以下为必需项:

  • 在目标计算机上,一个受支持的 2PF 网卡。

  • 在主计算机上,一个网卡。

  • 目标与主计算机之间的网络连接。

  • Windows 10 版本 21313 及更高版本。

受支持的 2PF 网卡

NVIDIA Mellanox 和 Cisco 等供应商提供支持 2PF 网络调试的 NIC。 请咨询网卡供应商,查看支持哪些网卡模型。 请注意,某些供应商在共享相同 PnP ID 的网卡子集上支持 2PF。

使用 kdnet.exe 确认设备支持情况并查看 busparams 值

使用 kdnet.exe 实用工具显示支持 KDNET 2PF 传输调试的控制器的参数信息。

  1. 确认主计算机系统上已安装 Windows 调试工具。 有关下载和安装调试器工具的信息,请参阅适用于 Windows 的调试工具

  2. 找到 kdnet.exe 和 VerifiedNICList.xml 文件。 默认情况下,它们位于此处。

    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

  3. 在主计算机上,将这两个文件复制到网络共享或 U 盘,以便在目标计算机上可用。

  4. 在目标计算机上,创建 C:\KDNET 目录,并将 kdnet.exe 和 VerifiedNICList.xml 文件复制到该目录。

  5. 在目标计算机上,以管理员身份打开“命令提示符”窗口。 输入此命令,以验证目标计算机是否具有受支持的网络适配器,并查看 busparams 值。

    
    C:\KDNET>kdnet.exe
    
    Network debugging is supported on the following NICs:
    busparams=141.0.0, Mellanox ConnectX-4 Lx Ethernet Adapter #2, Plugged in, Primary function, multiple physical functions are supported.
    
    Network debugging is supported on the following USB controllers:
    busparams=128.15.0, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
    busparams=0.15.0, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
    busparams=128.15.1, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
    busparams=0.15.1, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
    

    由于上面所示的输出不包括 “KDNET 正在此 NIC 上运行”,这表示未在任何适配器上启用传统的 KDNET 调试。

    如果 NIC 支持多个 PF 功能,则显示的信息将会省略(为空白)“支持多个物理功能”PF 状态通知。

    如果 NIC 支持多个 PF,则实际显示的信息将取决于网络端口的组合(根端口/PF 添加的端口),以及与 NIC 物理端口的连接/断开连接状态。

    下表汇总了主 NIC 的不同 PF 通知。

    NIC 适配器 bus.dev.fun 对应于 电缆状态 PF 状态
    原始(主要) 已连接的 PF 电缆 主要函数,已启用多个物理函数
    原始(主要) 断开连接的 PF 电缆 主要函数,支持多个物理函数

    下表汇总了辅助 NIC 的不同 PF 通知。

    NIC 适配器 bus.dev.fun 对应于 电缆状态 PF 状态
    新(辅助)PF 端口 Kdnet 正在运行 次要函数
    新(辅助)PF 端口 电缆断开连接或未知状态 主要函数,启用了多个物理函数,但不使用次要函数
  6. 如果 kdnet.exe 的输出指示受支持的 NIC 控制器可用,则可以继续操作。

为 2PF 设置目标计算机

按照以下步骤,使用 kdnet.exe 实用工具在 2PF 的目标电脑上配置调试器设置。

重要

在使用 bcdedit 更改启动信息之前,可能需要在测试电脑上暂时挂起 Windows 安全功能,例如 BitLocker 和安全启动。 使用 BCDEdit 更新启动信息后,可以重新启用 Bit Locker 和安全启动。 在禁用安全功能时,适当地管理测试电脑。

此过程将向 NIC 添加新的物理函数 (PF),由 bus.device.function 指定。 新 PF 只能由 KDNET 使用,因为 Windows 收件箱驱动程序设置为不在添加的次要 PF 上运行。 按照以下步骤添加将由调试设备使用的新 PF。

在添加新的物理函数之前,确认调试已禁用

  1. 在 NIC 上添加新 PF 之前,使用 BCDEdit 命令确认已在目标上禁用 KD。 这需要确保加载标准供应商 NIC 驱动程序,以便可用于添加新 PF。
C:\> bcdedit /enum 
...

debug           No

或者,使用不带参数的 kdnet.exe 来查看是否启用了调试。 以下输出显示了在一个 NIC 上启用了调试的系统上运行的 KDNET。 这是性能较低的旧版设置。


c:\Debuggers>kdnet

Network debugging is supported on the following NICs:
busparams=141.0.0, Mellanox ConnectX-4 Lx Ethernet Adapter #2, KDNET is running on this NIC.

Network debugging is supported on the following USB controllers:
busparams=128.15.0, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
busparams=0.15.0, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
busparams=128.15.1, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
busparams=0.15.1, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
  1. 如果调试值设置为“是”,请使用设置命令禁用调试。
C:\> bcdedit.exe /debug off
C:\> bcdedit.exe /set {default} bootdebug off
C:\> bcdedit.exe /set {bootmgr} bootdebug off
  1. 使用管理员命令提示符中的 shutdown -r -t 0 命令重新启动。

目标电脑重启并禁用调试后,可以添加新的物理函数。

添加新的物理函数

  1. 打开提升的命令提示符,并运行以下命令以添加第二个 PF。 所有值都使用十进制值提供。
C:\KDNET> kdnet -addpf 141.0.0 198.51.100.1 50001

Succeeded adding a Pci PF on :141.0.1. Please power off or reboot the machine.

Enabling network debugging on Mellanox ConnectX-4 Lx Ethernet Adapter #2.
Manage-bde.exe not present.  Bitlocker presumed disabled.

To debug this machine, run the following command on your debugger host machine.
windbg -k net:port=50001,key=2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p

Then reboot this machine by running shutdown -r -t 0 from this command prompt.

bus.dev.fun 是支持多个 PF 功能的 NIC 适配器的 PCI 位置端口,因此新 PF 将添加/附加到此网络设备。

-addpf 选项可在添加的 PF 端口上通过 KDNET 传输自动启用内核调试。

[host name/host ip address] 是主计算机的 TCP/IP 地址。 使用主计算机上的 ipconfig 命令确定此地址。

[port number] 是 TCP/IP 端口号。 可以选择从 49152 到 65535 的任何端口号。 建议的范围介于 50000 和 50039 之间。 选择的端口将由在主计算机上运行的调试器打开以独占访问权限。 在建议的 50000-50039 范围内,为每个使用的目标/主计算机对选择唯一的端口地址。 示例中显示了 50005。

请注意,-addpf 还会将 NO_KDNIC 属性添加到操作系统安装 {default} loadoptions。 这是因为不再需要 KDNIC 在 KDNET 上运行。

将 loadoptions = NO_KDNIC 添加到 {default} OS 标记,以确保 kdnic.sys 不会用完新添加的 pf (141.0.1)

使用 bcdedit 命令确认已设置 NO_KDNIC。

C:\KDNET> bcdedit /enum {default}

Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.efi
description             Windows Server
locale                  en-US
loadoptions             NO_KDNIC
inherit                 {bootloadersettings}
recoverysequence        {c23c4005d-12ae-11eb-9399-ac9840c152e7}
displaymessageoverride  Recovery
recoveryenabled         Yes
bootdebug               No
testsigning             Yes
isolatedcontext         Yes
flightsigning           Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \Windows
resumeobject            {c23c4005d-12ae-11eb-9399-ac9840c152e7}
nx                      OptOut
debug                   Yes
hypervisordebug         No

2. Run the bcdedit /enum command to display the generated key.

```console
C:\KDNET> bcdedit /dbgsettings
busparams               141.0.1
key                     2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
debugtype               NET
hostip                  198.51.100.1
port                    50001
dhcp                    Yes
The operation completed successfully.
   
  1. 将返回的密钥复制到记事本 .txt 文件中。 在所示的示例中,生成的密钥值为:

    2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p

  2. (可选)使用 kdnet.exe 来确认已启用多个物理函数。

C:\KDNET> kdnet.exe

Network debugging is supported on the following NICs:
busparams=141.0.0, Mellanox ConnectX-4 Lx Ethernet Adapter #2, Plugged in, Primary function, multiple physical functions are enabled.
busparams=141.0.1, Mellanox ConnectX-4 Lx Ethernet Adapter, KDNET is running on this NIC, Secondary function.

Network debugging is supported on the following USB controllers:
busparams=128.15.0, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
busparams=0.15.0, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
busparams=128.15.1, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
busparams=0.15.1, Standard USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)

禁用主计算机上的防火墙

在主计算机上,禁用调试器端口的防火墙。

将 WinDbg 连接到目标进行内核调试

在主计算机上打开 WinDbg。 在“文件”菜单上,选择“内核调试”。 在“内核调试”对话框中,打开 Net 选项卡。粘贴以前保存在记事本 .txt 文件中的端口号和密钥。 选择“确定”

还可以通过打开命令提示符窗口并输入以下命令来启动 WinDbg 会话,其中内容为上述所选择的端口以及上述由 kdnet.exe 返回的密钥。 粘贴以前保存在记事本 .txt 文件中的密钥。

windbg -k -d net:port=<YourDebugPort>,key=<YourKey>

重新启动目标计算机

连接调试器后,重新启动目标计算机。 重启电脑的一种方法是使用管理员命令提示符中的 shutdown -r -t 0 命令。

目标电脑重启后,调试器应自动连接。

计算机重新启动后,NIC 固件会将新的 MAC 地址分配给新添加的 KDNET PF,dbgsettings::busparams 将指向新添加的 PF。

查找 2PF 适配器的 MAC 地址

由于新添加的 PF 是 PCI 总线配置端口,因此将有一个新的 MAC 地址值由 NIC 固件分配给新添加的 PF。 kdnet.exe 工具当前不支持显示已添加 2PF 的 MAC 地址。

可通过两种方式查找新的 MAC 地址:

将 WinDbg/KD 与本地 KD 会话配合使用

在目标上运行本地内核调试器 windbg.exe -kl。

通过运行 .reload /f kdnet.dll,确保有权访问 kdnet.pdb 符号文件

运行 .kdtargetmac 命令以获取 MAC 地址。

kd> .kdtargetmac
Force unload of kdnet.dll
ModLoad: fffff800`18510000 fffff800`18557000   kdnet.dll
Loading symbols for fffff800`18510000        kdnet.dll ->   kdnet.dll

The target machine MAC address in open-device format is: DC9840C151E8

运行供应商提供的固件工具

找到 MAC 地址的一种方法是运行供应商提供的固件工具。 有关下载、安装和使用供应商工具的信息,请咨询 NIC 供应商。

... 
Base MAC:              98039baa757c           4

查找 MAC 地址字段。 通过将一个地址值按顺序添加到根 MAC 设备的最后一位数字来计算 KDNET 2PF MAC 地址值。 因此,对于具有地址 98039baa757c 的根设备,KDNET 2PF 设备将具有地址 98039baa757d

还原以前的配置状态 - 删除第二个 PCI PF

可以使用 kdnet -removepf 选项和原始 bus.device.function 值从设备删除以前添加的 PF。 PF 将从 NIC 分离,PF 分配的资源将由 NIC 固件释放。

要从设备中删除 KDNET PF,请打开提升的命令提示符并运行以下命令。

kdnet -removepf [bus.dev.fun] [host name/host ip address] [port number]

其中 bus.dev.fun 是最初连接 PF 的 NIC 适配器的 PCI 位置端口。 这与最初传递给 kdnet -addpf 的 PCI 位置相同。

使用 -removepf 选项还可以在原始 bus.dev.fun 上通过 KDNET 重新启用内核调试。

C:\KDNET> kdnet -removepf 141.0.0 198.51.100.1 50001

Succeeded removing a Pci PF on :141.0.0. Please power off or reboot the machine.

Enabling network debugging on Mellanox ConnectX-4 Lx Ethernet Adapter #2.
Manage-bde.exe not present.  Bitlocker presumed disabled.

kdnet.exe -removepf 命令还将从操作系统安装 {default} loadoptions 中删除 NO_KDNIC 属性,因为 KDNET 将在原始 bus.dev.fun 上启用,即 dbgsettings::busparams 将指向原始网络端口。 这将导致再次使用 KDNIC,从而在 KDNET 上再次提供网络连接。

删除 PF 后,需要重新启动计算机才能应用 BCD 更改。

shutdown -r -t 0

主计算机适配器配置疑难解答

验证设备管理器中是否存在 2PF 适配器

通过检查新 NIC 适配器在 Windows 设备管理器适配器列表中是否具有新的 bus.dev.fun 端口来验证是否已成功添加 KDNET PF。

此图显示了三个不同的适配器,其中保留适配器 #2 供内核调试器使用。

设备管理器显示具有 Windows KDNET 2PF 支持的网络适配器节点的网络节点。

常见错误消息 - 添加新 PF

C:\KDNET> kdnet -addpf 28.0.0 192.168.137.1 50005

Device Name:\\.\Mlx5Util

Pci Bus:28.0.0

PCI PF 已在此端口上配置错误=(0x80004004) 调试设备上 PF 操作失败。未为 KDNET 配置调试设备。

  • 不要在根端口上添加/删除 PF(已在此将其添加为 PF)。

常见错误消息 - 删除 PF

C:\KDNET> kdnet -removepf 28.0.1 192.168.137.1 50005

Adapter is not active: Error=(0x80070002)

Device Name:\\.\Mlx5Util

Pci Bus:28.0.1

适配器未处于活动状态:错误=(0x80070002) 调试设备上 PF 操作失败。未为 KDNET 配置调试设备

  • 不要将添加的 PF 端口与 “-removepf/-addpf” 命令行参数一起使用,因为对添加的 PF 端口执行任何操作都会导致失败(错误:适配器在端口上未处于活动状态),因为供应商 NIC 收件箱驱动程序明确设置为在添加的 PF 上运行。
  • 这两个命令行选项 (-addpf/-removepf) 都必须只在根 PCI 设备上使用。
C:\KDNET> kdnet -removepf 28.0.0 192.168.137.1 50005

Device Name:\\.\Mlx5Util

Pci Bus:28.0.0

在此端口上没有要删除的 PCI PF错误=(0x80004005) 调试设备上 PF 操作失败。未为 KDNET 配置调试设备。

  • 如果添加新 PF,然后决定在不重新启动的情况下将其删除,这将导致失败,因为供应商 NIC 固件需要重新启动/重置 NIC HW,然后才能识别新添加的 PF。

一些常见的错误消息 - BCDEdit

BCD OS {default} 安装中存在 NO_KDNIC。

  • 不建议在添加新 PF 后使用 bcdedit.exe 修改/更改调试设备 (dbgsettings)。 kdnet -addpf/removepf 命令行选项将配置调试设备,还将自动向/从 {default}::loadoptions 中添加/删除 NO_KDNIC 令牌。

另请参阅

自动设置 KDNET 网络内核调试

手动设置 KDNET 网络内核调试

设置 USB 3.0 xHCI-DBC 内核模式调试 (KDUSB)

设置 USB KDNET EEM 内核模式调试 (KDNET-EEM-USB)

手动设置内核模式调试