KDNET을 사용하여 2PF Kernel-Mode 디버깅 설정

  • 아티클
  • 2023. 04. 14.
  •  

이 문서의 내용

  1. Kernel-Mode 2PF 디바이스 요구 사항
  2. 지원되는 2PF 네트워크 카드
  3. kdnet.exe 사용하여 디바이스 지원 확인 및 busparams 값 보기
  4. 2PF에 대한 대상 컴퓨터 설정

Windows용 디버깅 도구는 PCI 구성 공간을 분할하여 지원되는 NIC에서 여러 PF(물리적 함수)를 사용하여 네트워크 케이블을 통해 커널 디버깅을 지원합니다.

2PF 디버깅을 사용하면 각 PF를 단일 네트워크 포트에 연결할 수 있으므로 표준 네트워크 스택이 다른 PF와 협상하는 동안 커널 디버깅 기능을 하나의 PF에 연결할 수 있습니다. 이 때문에 KDNIC는 KDNET을 통해 Windows 네트워킹 트래픽을 라우팅할 필요가 없으며 KDNET은 호스트 커널 디버거 트래픽만 라우팅합니다. 이로 인해 성능이 크게 향상됩니다.

이 항목에서는 kdnet.exe 유틸리티를 사용하여 2PF 디버깅을 설정하는 방법을 설명합니다.

네트워크 카드 공급업체는 이 기능에 대한 지원을 사용하도록 설정하는 것이 좋습니다. 자세한 내용은 디버거 2PF KDNET Miniport 네트워크 드라이버 지원을 참조하세요.

분할된 PCI 구성 공간에서 두 개의 드라이버가 실행됩니다.

  • Windows 받은 편지함 드라이버가 bus.dev 주 네트워크 포트에서 실행됩니다. fun0.0 PCI 위치.
  • KDNET-Ext입니다. 모듈은 bus.dev 추가된 PF가 부족합니다. fun0.1, 이 기술은 Windows 받은 편지함 NIC 드라이버가 KDNET과 NIC를 공유하여 영향을 받지 않도록 합니다.

디버거를 실행하는 컴퓨터를 호스트 컴퓨터라고 하며 디버그 중인 컴퓨터를 대상 컴퓨터라고 합니다.

Kernel-Mode 2PF 디바이스 요구 사항

이 작업을 위해서는 다음이 준비되어 있어야 합니다.

  • 대상 컴퓨터에서 지원되는 2PF 네트워크 카드.
  • 호스트 컴퓨터에서 네트워크가 카드.
  • 대상과 호스트 간의 네트워크 연결입니다.
  • 빌드 21313 이상을 Windows 10.

지원되는 2PF 네트워크 카드

NVIDIA Mellanox 및 Cisco와 같은 공급업체는 2PF 네트워크 디버깅을 지원하는 NIC를 제공합니다. 네트워크 카드 공급업체에 문의하여 지원되는 네트워크 카드 모델을 확인합니다. 일부 공급업체는 동일한 PnP ID를 공유하는 네트워크 카드의 하위 집합에서 2PF를 지원합니다.

kdnet.exe 사용하여 디바이스 지원 확인 및 busparams 값 보기

kdnet.exe 유틸리티를 사용하여 KDNET 2PF 전송 디버깅을 지원하는 컨트롤러에 대한 매개 변수 정보를 표시합니다.

  1. Windows 디버깅 도구가 호스트 시스템에 설치되어 있는지 확인합니다. 디버거 도구를 다운로드하고 설치하는 방법에 대한 자세한 내용은 Windows용 디버깅 도구를 참조하세요.
  2. kdnet.exe 찾아 파일을 VerifiedNICList.xml. 기본적으로 여기에 있습니다.
  3. C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
  4. 호스트 컴퓨터에서 두 파일을 네트워크 공유 또는 썸 드라이브에 복사하여 대상 컴퓨터에서 사용할 수 있도록 합니다.
  5. 대상 컴퓨터에서 디렉터리를 만들고 C:\KDNET kdnet.exe 복사하고 파일을 해당 디렉터리에 VerifiedNICList.xml.
  6. 대상 컴퓨터에서 관리자 권한으로 명령 프롬프트 창을 엽니다. 대상 컴퓨터에 지원되는 네트워크 어댑터가 있는지 확인하고 busparams 값을 보려면 이 명령을 입력합니다.
  7. dbgcmd
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 상태
original(기본) 연결된 PF 케이블 주 함수, 여러 물리적 함수 사용
original(기본) PF 케이블 연결이 끊김 기본 함수, 여러 물리적 함수가 지원됩니다.

이 표에는 보조 NIC에 대한 다양한 PF 알림이 요약됩니다.

 
  1. NIC 어댑터 bus.dev.fun 케이블 상태 PF 상태
    새(보조) PF 포트 Kdnet이 실행 중입니다. 보조 함수
    새(보조) PF 포트 케이블 연결이 끊어지거나 알 수 없는 상태 주 함수는 여러 물리적 함수를 사용하도록 설정되지만 보조 함수는 사용되지 않습니다.
  2. kdnet.exe 출력에서 지원되는 NIC 컨트롤러를 사용할 수 있음을 나타내는 경우 계속 진행할 수 있습니다.

2PF에 대한 대상 컴퓨터 설정

kdnet.exe 유틸리티를 사용하여 다음 단계에 따라 대상 PC에서 2PF용 디버거 설정을 구성합니다.

중요

bcdedit를 사용하여 부팅 정보를 변경하기 전에 테스트 PC에서 BitLocker 및 보안 부팅과 같은 Windows 보안 기능을 일시적으로 일시 중단해야 할 수 있습니다. BCDEdit을 사용하여 부팅 정보를 업데이트한 후에는 Bit Locker 및 Secure Boot를 다시 사용하도록 설정할 수 있습니다. 보안 기능이 사용하지 않도록 설정된 경우 테스트 PC를 적절하게 관리합니다.

이 프로세스는 로 지정된 NIC에 새 PF(물리적 함수)를 bus.device.function추가합니다. Windows 받은 편지함 드라이버가 추가된 보조 PF에서 실행되지 않도록 설정되어 있으므로 새 PF는 KDNET에서만 사용할 수 있습니다. 디버그 디바이스에서 사용할 새 PF를 추가하려면 다음 단계를 수행합니다.

새 물리적 함수를 추가하기 전에 디버깅이 비활성화되어 있는지 확인합니다.

  1. BCDEdit 명령을 사용하여 NIC에 새 PF를 추가하기 전에 대상에서 KD가 비활성화되어 있는지 확인합니다. 새 PF를 추가하는 데 사용할 수 있도록 표준 공급업체 NIC 드라이버가 로드되었는지 확인하는 데 필요합니다.
콘솔
C:\> bcdedit /enum 
...

debug           No

또는 out 매개 변수와 함께 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. 디버그 값이 예로 설정된 경우 set 명령을 사용하여 디버깅을 사용하지 않도록 설정합니다.
콘솔
C:\> bcdedit.exe /debug off
C:\> bcdedit.exe /set {default} bootdebug off
C:\> bcdedit.exe /set {bootmgr} bootdebug off
  1. 관리자의 shutdown -r -t 0 명령 프롬프트에서 명령을 사용하여 다시 부팅합니다.

대상 PC를 다시 시작하고 디버깅을 사용하지 않도록 설정한 후에는 새 물리적 기능을 추가할 수 있습니다.

새 물리적 함수 추가

  1. 관리자 권한 명령 프롬프트를 열고 다음 명령을 실행하여 두 번째 PF를 추가합니다. 모든 값은 10진수 값을 사용하여 제공됩니다.
콘솔
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는 OS 설치 {default} loadoptions에도 특성을 추가 NO_KDNIC 합니다. KDNIC는 더 이상 KDNET을 기반으로 실행할 필요가 없기 때문입니다.

kdnic.sys 새로 추가된 pf(141.0.1)가 부족하지 않도록 loadoptions = NO_KDNIC {default} OS 태그에 추가됩니다.

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 파일에 복사합니다. 표시된 예제에서 생성된 키의 값은 다음과 같습니다.
  2. 2steg4fzbj2sz.23418vzkd4ko3.1g34ou07z4pev.1sp3yo9yz874p
  3. 선택적으로 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>

대상 컴퓨터 다시 부팅

디버거가 연결되면 대상 컴퓨터를 다시 부팅합니다. PC를 다시 부팅하는 한 가지 방법은 관리자의 명령 프롬프트에서 명령을 사용하는 shutdown -r -t 0 것입니다.

대상 PC가 다시 시작되면 디버거가 자동으로 연결됩니다.

컴퓨터가 다시 부팅되면 NIC 펌웨어는 새 추가된 KDNET PF에 새 MAC 주소를 할당하고 dbgsettings::busparams는 새로 추가된 PF를 가리킵니다.

2PF 어댑터의 MAC 주소 찾기

새로 추가된 PF는 PCI 버스 구성 포트이므로 NIC 펌웨어에서 새로 추가된 PF에 새 MAC 주소 값이 할당됩니다. kdnet.exe 도구는 현재 추가된 2PF에 대한 MAC 주소 표시를 지원하지 않습니다.

새 MAC 주소를 찾는 방법에는 두 가지가 있습니다.

로컬 KD 세션과 함께 WinDbg/KD 사용

대상에서 로컬 커널 디버거 windbg.exe -kl을 실행합니다.

.reload /f kdnet.dll 실행하여 kdnet.pdb 기호 파일에 액세스할 수 있는지 확인합니다.

.kdtargetmac 명령을 실행하여 MAC 주소를 가져옵니다.

dbgcmd
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 제거

옵션 및 원래 bus.device.function 값을 사용하여 kdnet -removepf 이전에 추가한 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 명령은 원래 bus.dev.fun KDNET이 사용하도록 설정되므로 OS 설치 {default} 로드옵션에서 NO_KDNIC 특성을 제거합니다. 즉, dbgsettings::busparams가 원래 네트워크 포트를 가리킵니다. 이로 인해 KDNIC가 다시 사용되어 KDNET 위에 네트워크 연결이 다시 제공됩니다.

PF가 제거되면 BCD 변경 내용을 적용하려면 컴퓨터를 다시 부팅해야 합니다.

콘솔
shutdown -r -t 0

호스트 어댑터 구성 문제 해결

디바이스 관리자에 2PF 어댑터가 있는지 확인합니다.

새 NIC 어댑터에 Windows 디바이스 관리자 어댑터 목록에 새 bus.dev.fun 포트가 있는지 확인하여 KDNET PF가 성공적으로 추가되었는지 확인할 수 있습니다.

이 다이어그램은 커널 디버거에서 사용할 수 있는 어댑터 #2가 예약된 세 가지 어댑터를 보여 줍니다.

일반적인 오류 메시지 - 새 PF 추가

콘솔
C:\KDNET> kdnet -addpf 28.0.0 192.168.137.1 50005

Device Name:\\.\Mlx5Util

Pci Bus:28.0.0

PCI PF는디버그 디바이스에서 Error=(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

어댑터가 활성화되지 않음: 디버그 디바이스에서 Error=(0x80070002) PF 작업이 실패했습니다. 디버그 디바이스가 KDNET에 대해 구성되지 않았습니다.

  • 공급업체 NIC 받은 편지함 드라이버가 추가된 PF에서 명시적으로 실행되지 않도록 설정되어 있으므로 추가된 PF 포트에 대한 작업이 실패(오류: 어댑터가 포트에서 활성화되지 않음)가 발생하므로 추가된 PF 포트를 "-removepf/-addpf" 명령줄 매개 변수와 함께 사용하지 마세요 .
  • 두 명령줄 옵션(-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가 없습니다. 디버그 디바이스에서 Error=(0x80004005) PF 작업이 실패했습니다. 디버그 디바이스가 KDNET에 대해 구성되지 않았습니다.

  • 새 PF를 추가한 다음 다시 부팅하여 제거하려는 경우 공급업체 NIC 펌웨어가 새로 추가된 PF를 인식하기 전에 NIC HW를 다시 부팅/초기화해야 하므로 오류가 발생합니다.

일반적인 오류 메시지 - BCDEdit

NO_KDNIC BCD OS {default} 설치에 없습니다 .

  • 새 PF를 추가한 후 bcdedit.exe 사용하여 디버그 디바이스(dbgsettings)를 수정/변경하는 것은 권장되지 않습니다. kdnet -addpf/removepf 명령줄 옵션은 디버그 디바이스를 구성하고 에서 토큰을 자동으로 NO_KDNIC 추가/ {default}::loadoptions제거합니다.

추가 정보

KDNET 네트워크 커널 디버깅 자동 설정

수동으로 KDNET 네트워크 커널 디버깅 설정

USB 3.0 케이블을 통해 수동으로 커널 모드 디버깅 설정

수동으로 Kernel-Mode 디버깅 설정

Posted by gurupia
,