Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konuda, ayrı bir donanım sürücüsü genişletilebilirlik modülü dll'si kullanarak KDNET aktarımının herhangi bir donanımda çalışacak şekilde nasıl genişletilebileceği açıklanmaktadır. KDNET aktarım genişletilebilirlik modülleri, belirli ağ kartlarına çekirdek hata ayıklama desteği eklemek için ağ kartı satıcıları tarafından geliştirilmiştir.
KDNET'e Genel Bakış
KDNET, ağ üzerinden pencerelerin çekirdek hata ayıklamasını sağlayan bir çekirdek hata ayıklama aktarımıdır. Başlangıçta Ethernet NIC'leri ile çekirdek hata ayıklamasını desteklemek için kullanıldı. Donanım destek katmanının, ağ paketi işleme ve çekirdek arabirimi katmanından ayrı bir modülde yerleştirilmiş şekilde tasarlanmıştır. Bu donanım sürücüsü destek katmanına KDNET genişletilebilirlik modülü adı verilir.
KDNET, ayrı bir donanım sürücüsü genişletilebilirlik modülü dll'si kullanarak herhangi bir donanımda çalıştırılacak şekilde genişletilebilen tek aktarımdır. KDNET ve KDNET genişletilebilirlik modülleri aracılığıyla Windows'un tüm hata ayıklamasını destekleme hedefidir. Diğer tüm çekirdek aktarım DLL'leri (kdcom.dll, kd1394.dll, kdusb.dllvb.) kullanım dışı bırakılacak ve Windows'tan kaldırılacaktır.
KDNET'in KDNET genişletilebilirlik modülleriyle iletişim kurmak için kullandığı iki tür arabirim vardır. Bunlardan biri NIC'ler, USB ve kablosuz donanımlar için kullanılan paket tabanlı bir arabirim, diğeri ise seri donanım üzerinden KDNET'i desteklemek için kullanılan bayt tabanlı bir arabirimdir.
KDNET genişletilebilirlik modüllerinin doğru çalışabilmesi için çok sıkı gereksinimlere uyması gerekir. Çekirdek hata ayıklaması için kullanıldığından, sistem kodun daha fazla yürütülmesini beklettiğinde çağrılır ve yürütülür. Genellikle, çekirdek hata ayıklama aktarımı yoluyla ana makinede çalışan hata ayıklayıcı uygulamasıyla iletişimde olan işlemci hariç, sistemdeki tüm işlemciler bir IPI içinde sürekli dönerek kilitlenir. Bu işlemci genellikle kesmeler tamamen devre dışı bırakılmış olarak çalışır ve temelde hata ayıklayıcıdan komut gelmesini bekleyen hata ayıklama aktarım donanımı üzerinde döner.
İthalat ve ihracat
KDNET genişletilebilirlik modüllerinin tek bir açık dışarı aktarması vardır: KdInitializeLibrary. Ayrıca belirgin içeri aktarmaları yoktur. KDNET genişletilebilirlik modülleri, KdInitializeLibrary çağırdığında KDNET tarafından çağrılmasına izin verilen yordamların listesini içeren bir yapıya işaretçi geçirilir. Başka hiçbir rutin çağrılmaz. Nokta. İçeri aktarmaları olan KDNET genişletilebilirlik modülleri yanlış tasarlanmıştır ve desteklenmez.
Link /dump /exports ve link /dump /imports komutlarını kullanarak bir KDNET genişletilebilirlik modülünün içeri ve dışarı aktarım listesini çıkartırsanız, bunların yalnızca bir dışarı aktarımı (KdInitializeLibrary) ve içeri aktarımı olmadığını anlarsınız. KDNET genişletilebilirlik modülleri, KdInitializeLibrary çağrıldığında KDNET'in bir işaretçi geçirdiği dışarı aktarma işlevleri yapısındaki işlev işaretçilerini doldurarak ek dışarı aktarmalarını KDNET'e bildirir. KDNET daha sonra bu yapıdaki işlev işaretçilerini kullanarak genişletilebilirlik modülünü çağırır ve modülün desteklediği donanımı kullanarak veri aktarımlarını etkiler. KDNET, modülün yapıdaki dışarı aktarma işlevi tablosunu hangi işlevleri doldurduğuna bakarak modülün paket tabanlı mı yoksa bayt tabanlı bir modül mü olduğunu belirler. Bu işlevlerden bazıları paket tabanlı donanımı desteklemeye, diğerleri ise seri tabanlı donanıma yöneliktir. Tablodaki bazı işlevler hem seri hem de paket tabanlı donanım (KdInitializeController, KdShutdownController, KdGetHardwareContextSize) tarafından kullanılır.
Kod tasarımı
KDNET genişletilebilirlik modülleri tek iş parçacıklı kod olarak yazılmalıdır. Herhangi bir eşitleme gerçekleştirmemeleri gerekir. Tüm çekirdek hata ayıklama aktarımları, hata ayıklayıcı girildiğinde uygun eşitlemeyi yapmak için Windows çekirdeğine bağlıdır. Çekirdeğin, çekirdek hata ayıklayıcısına girerken aldığı bir hata ayıklayıcısı kilidi vardır ve hata ayıklayıcı girildiğinde sistemdeki diğer işlemcileri de bir IPI'ye kilitler. Bu işlemciler, yalnızca konakta çalışan çekirdek hata ayıklayıcısı hedef makineye yürütmenin devam etmesi için izin vermesini söylediğinde serbest bırakılır. Çekirdek bu eşitlemeyi yaptığı için, KDNET genişletilebilirlik modüllerinin kodlarında kesinlikle herhangi bir spinlock, mutexes, gates veya başka bir Windows eşitleme mekanizması kullanmaması gerekir. Paketleri ve veya baytları göndermek ve almak için ilgili donanımlarını doğrudan programlayacak şekilde yazılmalıdır.
KDNET genişletilebilirlik modülü kodu mümkün olduğunca basit hale getirilmelidir. Bu, KDNET genişletilebilirlik modülü kodunun bir makinede canlı olarak hata ayıklaması şu anda donanım hata ayıklayıcısı kullanılmadan mümkün olmadığından, mümkün olduğunca hatasız olduğundan emin olunmasını sağlar. Çekirdek hata ayıklama aktarım kodunda hata ayıklamak için çekirdek hata ayıklayıcısını kullanamazsınız. Bunu yapmak, taşan çekirdek yığını (genellikle çift hata ve yeniden başlatma ile sonuçlanır) veya kilitlenme nedeniyle makinenin yeniden başlatılmasına neden olur ya da aktarımın yeniden girilmesine neden olur ve bu da çoğu durumda taşımanın düzgün çalışmamasıyla sonuçlanır.
KDNET genişletilebilirlik modülleri adlandırma kuralları
Çekirdek hata ayıklama aktarım modülünüz, KDNET genişletilebilirlik modülleri için iki adlandırma kuralından birini izlemelidir. Modülünüz PCI tabanlı bir donanım içindir ve bu nedenle, XXXX donanımınızın onaltılık PCI satıcı kimliğini ve YY donanımınızın PCI sınıfını temsil ederse, kd_YY_XXXX.dll olarak adlandırılmalıdır. Windows'ta PCI tabanlı donanımı destekleyen birkaç KDNET genişletilebilirlik modülü dahildir. Örneğin, Intel'in kd_02_8086.dll, Broadcom'un kd_02_14e4.dllve Realtek'in kd_02_10ec.dll. Kayıtlı PCI satıcı kimliklerini https://www.pcisig.com/membership/member-companies adresinde bulabilirsiniz. Tüm PCI tabanlı KDNET genişletilebilirlik modülleri, adlarının son 4 karakteri olarak destekledikleri donanımın onaltılık satıcı VID'sini kullanır. Çoğu in box modülünün sınıf kodu 02'dir çünkü bunlar ağ sınıfı cihazlarıdır ve bu nedenle PCI yapılandırma alanında bir PCI sınıfı 0x02 vardır. Winload.exe, PCI cihaz sınıfını ve seçilen hata ayıklama cihazının PCI VID'sini kendi PCI yapılandırma alanından okuyarak PCI tabanlı KDNET genişletilebilirlik modüllerinin adını oluşturur ve adında bu tanımlayıcılarla bir modül yüklemeye çalışır. Cihazınızda ağ 0x02 sınıfı olmayan bir PCI sınıf kodu varsa, KDNET genişletilebilirlik modülünüz adına cihazınız için onaltılık olarak doğru PCI sınıf kodunu kullanmanız gerekir. Aksi takdirde modülünüz winload tarafından doğru yüklenmez.
_02_ Bu adların her birinde, ağ sınıfı cihazlar için hex formatında PCI sınıf kodu bulunmaktadır. Bu kod ayrıca hata ayıklama cihazının PCI yapılandırma alanından da bulunur ve okunur.
DBG2 tablo girişi olan ve PCI tabanlı bir cihaz olmayan bir cihazınız varsa modülünüzün adlandırma kuralı farklıdır. DBG2 tablo hata ayıklama cihazları için adlandırma kuralı, kd_XXXX_YYYY.dll olarak tanımlanır; burada XXXX, DBG2 tablosundaki onaltılık PortType'ı ve YYYY, DBG2 tablo girdisindeki onaltılık PortSubtype'ı temsil eder. Kd_8003_5143.dll, 0x5143 alt türüne sahip bir net (0x8003) PortType'ı desteklemeye yönelik bir gelen kutusu DLL'dir. Bu durumda 5143, Qualcomm USB denetleyicilerinde KDNET'i desteklemeye yönelik olduğundan ve Net DBG2 tablo girişleri için PortSubtype, donanımın satıcısı için PCI VID olarak tanımlandığından Qualcomm PCI vid'dir. Bu adlandırma kuralını kullanarak seri, USB ve diğer DBG2 tablo cihazlarını destekleyebileceğinizi unutmayın. Şu anda onaltılık değerlerle desteklenen PortType değerleri şunlardır: Seri cihazlar için 8000, 1394 cihazlar için 8001, USB cihazlar için 8002, ve ağ (NET) cihazları için 8003. Seri ve USB cihazları için alt türlerin Microsoft ile ayrılmış olması gerektiğini unutmayın. Microsoft, ayrılan seri ve USB alt türlerinin listesini tutar. Eğer mevcut desteklenen türler donanımınızla çalışmıyorsa, bir seri veya USB alt türü ayırmak için lütfen kdnet@microsoft.com adresine posta gönderin.
KDNET Genişletilebilirlik İçeri Aktarmaları
Aşağıda, KDNET genişletilebilirlik modülünden çağırabileceğiniz yordamların listesi yer alır. Bu yordamların tümünün KdInitializeLibrary yordamına geçirildiğini ve kdnetextensibility.h üst bilgisinin içeri aktarma tablosundan geçmek için normal çağrıları bu yordamlarla yeniden eşlediğini unutmayın. Kodunuzun, modülünüzde herhangi bir içeri aktarma olmaması için bunları içeri aktarma tablosu üzerinden çağırması gerekmektedir. Çekirdek, HAL veya başka bir çekirdek modülü tarafından dışarı aktarılan diğer yordamları çağıramayın. Yalnızca bu rutinleri çağırabilirsiniz. Bu yordam kümesi, tüm kutu içindeki KDNET genişletilebilirlik modüllerini geliştirmek için yeterli olduğunu kanıtlamıştır ve normal senaryolar için yeterli olmalıdır. Çekirdek tarafından dışarı aktarılan ancak bu listede bulunmayan ek yordamlara ihtiyacınız varsa, lütfen senaryonuzu ve hangi ek yordamlara ihtiyacınız olduğunu ve nedenini açıklayan bir posta kdnet@microsoft.com gönderin. Bu listenin yalnızca ana Windows sürüm döngülerine (varsa) ekleneceğini unutmayın. Bu yordamların çoğunun doğrudan çekirdek veya HAL tarafından desteklenen Windows çekirdek API'lerine karşılık geldiğini unutmayın. Bir ya da iki tane sadece özel KDNET yordamıdır.
İçeri aktarma tablosu aracılığıyla yordamların doğru yeniden eşlemesinin gerçekleşebilmesi için üst bilgilerinize kdnetextensibility.h dosyasını düzgün bir şekilde eklemeniz önemlidir. Bu yapılmazsa, modülünüzün içe aktarımları olur ve desteklenmez.
Okuma yazma bellek işlemleri
Bellek eşlemeli cihaz belleğini okumak ve belleğe yazmak için aşağıdaki yordamlar kullanılmalıdır. Bunlar aynı çağrı kuralına sahiptir ve karşılık gelen çekirdek yordamlarıyla eşlenir: READ_REGISTER_UCHAR, READ_REGISTER_USHORT, READ_REGISTER_ULONG, WRITE_REGISTER_UCHAR, WRITE_REGISTER_USHORT, WRITE_REGISTER_ULONG; ve yalnızca 64 bit platformlarda READ_REGISTER_ULONG64 ve WRITE_REGISTER_ULONG64 bulunur. Okuma ve yazma işlemleri işlemci tarafından yeniden sıralanmadığından emin olduklarından tüm cihaz bellek erişimi bu yordamlar aracılığıyla yapılmalıdır. msdn.microsoft.com bu yordamlara çağırma kuralına karşılık gelen Windows CE Compact 2013 yordamlarını belgelediğini unutmayın. Ne yazık ki NT yordamları belgelenmemiş gibi görünüyor, ancak çağırma kuralı aynıdır.
Girdi/Çıktı portu rutinlerini okuma
Cihaz G/Ç bağlantı noktalarını okumak ve bu bağlantı noktalarına yazmak için aşağıdaki yordamlar kullanılmalıdır. Bunlar aynı çağrı kuralına sahiptir ve bunlara karşılık gelen çekirdek yordamlarıyla eşlenir: READ_PORT_UCHAR, READ_PORT_USHORT, READ_PORT_ULONG, WRITE_PORT_UCHAR, WRITE_PORT_USHORT ve WRITE_PORT_ULONG. Tüm cihaz GÇ bağlantı noktası erişimi bu işlemler aracılığıyla yapılmalıdır. msdn.microsoft.com'un bu işlevlerin çağrı kuralıyla uyumlu olan Windows CE Compact 2013 işlevlerini belgelediğini unutmayın.
Ek rutinler
Aşağıdaki ek yordamlar çağrılabilir ve belirtilen parametrelerle normal şekilde çağrılmalıdır. Şunu unutmayın ki, kdnetextensibility.h üst bilgisi doğru şekilde dahil edildiğinde, işlev çağrıları KDNET genişletilebilirlik içe aktarma tablosu aracılığıyla yeniden eşlenir; bu da KDNET genişletilebilirlik modülleri için gerekli olduğu üzere modülünüzde açık içe aktarma yapılmamasına neden olur.
PHYSICAL_ADDRESS
KdGetPhysicalAddress (
__in PVOID Va
);
VOID
KeStallExecutionProcessor (
__in ULONG Microseconds
);
ULONG
KdGetPciDataByOffset (
__in ULONG BusNumber,
__in ULONG SlotNumber,
__out_bcount(Length) PVOID Buffer,
__in ULONG Offset,
__in ULONG Length
);
ULONG
KdSetPciDataByOffset (
__in ULONG BusNumber,
__in ULONG SlotNumber,
__in_bcount(Length) PVOID Buffer,
__in ULONG Offset,
__in ULONG Length
);
VOID
KdSetDebuggerNotPresent (
__in BOOLEAN NotPresent
);
VOID
PoSetHiberRange (
_In_opt_ PVOID MemoryMap,
_In_ ULONG Flags,
_In_ PVOID Address,
_In_ ULONG_PTR Length,
_In_ ULONG Tag
);
VOID
KeBugCheckEx (
__in ULONG BugCheckCode,
__in ULONG_PTR BugCheckParameter1,
__in ULONG_PTR BugCheckParameter2,
__in ULONG_PTR BugCheckParameter3,
__in ULONG_PTR BugCheckParameter4
);
PVOID
KdMapPhysicalMemory64 (
_In_ PHYSICAL_ADDRESS PhysicalAddress,
_In_ ULONG NumberPages,
_In_ BOOLEAN FlushCurrentTLB
);
VOID
KdUnmapVirtualAddress (
_In_ PVOID VirtualAddress,
_In_ ULONG NumberPages,
_In_ BOOLEAN FlushCurrentTLB
);
ULONG64
KdReadCycleCounter (
__out_opt PULONG64 Frequency
);
PoSetHiberRange işlevinin yalnızca KdSetHibernateRange yordamından çağrılması gerektiğini unutmayın. Ayrıca, çoğu KDNET genişletilebilirlik modülünün KeBugCheckEx, KdMapPhysicalMemory64 ve KdUnmapVirtualAddress'i çağırması gerekmez. Öte yandan, temel olarak tüm KDNET genişletilebilirlik modüllerinin cihaz DMA altyapılarını programlamak için gereken fiziksel bellek adreslerini almak için KdGetPhysicalAddress'i çağırması ve birçoğunun KeStallExecutionProcessor, KdGetPciDataByOffset ve KdSetPciDataByOffset'i çağırması gerekir. Son iki yordam, cihaz PCI yapılandırma alanına erişmeye yöneliktir.
KDNET Genişletilebilirlik Çıktıları
Aşağıda, KDNET genişletilebilirlik yordamlarının her birinin kısa bir açıklaması yer alır. Paket tabanlı KDNET genişletilebilirlik modülü veya seri tabanlı KDNET genişletilebilirlik modülü için gereken tüm yordamları uygulamanız gerekir. KDNET paket genişletilebilirlik modül dışa aktarımları şunlardır.
KdInitializeLibrary
/*++
Routine Description:
This routine validates that the ImportTable is a supported version. Makes
a copy of the ImportTable in its own global memory, and writes pointers to
functions that it exports into the Exports pointer also located in that
table.
This routine also writes the size in bytes of the Memory it needs into
the Length field of the Memory structure contained in the debug device
descriptor passed to this routine.
When kernel debugging is enabled, this routine will be called twice during
boot. The first time by winload to determine how much memory to allocate
for KDNET and its extensibility module, and the second time by KDNET when
the kernel first initializes the kernel debugging subsystem.
Arguments:
ImportTable - Supplies a pointer to the KDNET_EXTENSIBILITY_IMPORT
structure.
LoaderOptions - Supplies a pointer to the LoaderOptions passed to the
kernel. This allows settings to be passed to the KDNET extensibility
module using the loadoptions BCD setting.
Device - Supplies a pointer to the debug device descriptor.
Return Value:
STATUS_INVALID_PARAMETER if the version of the import or export table is
incorrect.
STATUS_SUCCESS if initialization succeeds.
--*/
NTSTATUS
KdInitializeLibrary (
__in PKDNET_EXTENSIBILITY_IMPORTS ImportTable,
__in_opt PCHAR LoaderOptions,
__inout PDEBUG_DEVICE_DESCRIPTOR Device
)
{
NTSTATUS Status;
PKDNET_EXTENSIBILITY_EXPORTS Exports;
__security_init_cookie();
Status = STATUS_SUCCESS;
KdNetExtensibilityImports = ImportTable;
if ((KdNetExtensibilityImports == NULL) ||
(KdNetExtensibilityImports->FunctionCount != KDNET_EXT_IMPORTS)) {
Status = STATUS_INVALID_PARAMETER;
goto KdInitializeLibraryEnd;
}
Exports = KdNetExtensibilityImports->Exports;
if ((Exports == NULL) || (Exports->FunctionCount != KDNET_EXT_EXPORTS)) {
Status = STATUS_INVALID_PARAMETER;
goto KdInitializeLibraryEnd;
}
//
// Return the function pointers this KDNET extensibility module exports.
//
Exports->KdInitializeController = KdInitializeController;
Exports->KdShutdownController = KdShutdownController;
Exports->KdSetHibernateRange = KdSetHibernateRange;
Exports->KdGetRxPacket = KdGetRxPacket;
Exports->KdReleaseRxPacket = KdReleaseRxPacket;
Exports->KdGetTxPacket = KdGetTxPacket;
Exports->KdSendTxPacket = KdSendTxPacket;
Exports->KdGetPacketAddress = KdGetPacketAddress;
Exports->KdGetPacketLength = KdGetPacketLength;
Exports->KdGetHardwareContextSize = KdGetHardwareContextSize;
//
// Return the hardware context size required to support this device.
//
Status = ContosoInitializeLibrary(LoaderOptions, Device);
KdInitializeLibraryEnd:
return Status;
}
Bu yordam, KDNET ile bu KDNET genişletilebilirlik modülü arasında içeri ve dışarı aktarma yordamlarını geçirmek için çağrılır. Bu prosedür, içeri aktarım ve dışarı aktarım tablolarının sürümünün beklendiği ve desteklendiğini doğrulamalı, aksi takdirde başarısız olmalıdır. İçeri aktarma tablosunun bir kopyasını kendi genel belleğinde oluşturmalıdır. Dışa aktardığı yordamları, import tablosunun Dışa Aktarmalar alanına işaret eden yapıya yazmalıdır. Ayrıca, bu prosedüre geçirilen hata ayıklama cihazı tanımlayıcı işaretçisinin bir parçası olan Bellek yapısının Uzunluk alanını, donanım cihazını desteklemek için gereken bellek baytları sayısına göre ayarlamalıdır.
İçeri aktarma sayısını doğrulama
Kod, "Imports FunctionCount" değerinin işletim sistemindeki (KdNetExtensibilityImports->FunctionCount != KDNET_EXT_IMPORTS) kullanılabilir değerlerle eşleşip eşleşmediğini denetlemeli ve sayı eşleşmiyorsa STATUS_INVALID_PARAMETER döndürmelidir.
Sayıların denetlenmesi, çalışan Windows işletim sistemi KDNET sürümü (örneğin, önyükleme yöneticisi/OS yükleyicisi/hiper yönetici/Tümü KDNET kitaplığına bağlanan güvenli çekirdek/NT OS) ile geçerli KDNET genişletilebilirlik modülünü oluşturmak için kullanılan WDK sürümü arasında uyumluluk sağlar. WDK ve işletim sistemi sürümü eşitlenmelidir; aksi takdirde, içeri/dışarı aktarma sayacı değeri değişirse yukarıdaki denetim başarısız olur. Örneğin, KDNET genişletilebilirlik arabirimi yeni bir özellik işlevi eklediyse, sayı artık eşleşmez. Bunların eşleştiğinden emin olmak için her zaman KDNET sürümünü barındıran işletim sistemiyle eşleşen WDK sürümünü kullanın.
Gerekli belleği özelleştirme
Cihazın hata ayıklayıcı için seçilen donanımla doldurulacağını unutmayın. Bu rutin, gerekirse cihaza bağlı olarak gereken bellek miktarını özelleştirmelidir. Örneğin, 1Gig ve 10Gig donanımlarını destekleyen genişletilebilirlik modülleri, 10Gig cihazları için istedikleri bellek boyutunu artırabilir. Hata ayıklama cihazı tanımlayıcısının DeviceID alanını inceleyerek hangi cihazın kullanıldığını belirleyebilirler.
KdInitializeLibrary tek dışa aktarılan fonksiyondur.
Bu yordamın hem winload hem de KdInitSystem çağrısı sırasında KDNET tarafından çağrılacağını unutmayın. KDNET genişletilebilirlik modülleri tarafından dışarı aktarılan tek rutinİN BU olduğunu unutmayın. Bir .def dosyasına yerleştirilen tek rutindir. KDNET genişletilebilirlik modüllerinin tam olarak tek bir açık dışarı aktarması (bu yordam) vardır ve içeri aktarma yoktur.
KdSetHibernateRange
VOID
KdSetHibernateRange (
VOID
)
/*++
Routine Description:
This routine is called to mark the code in the KDNET extensiblity module
so that it can be properly handled during hibernate and resume from
hibernate.
Arguments:
None.
Return Value:
None.
--*/
Bu yordam, KDNET genişletilebilirlik modülü tarafından kullanılan kodu sisteme düzgün bir şekilde kaydedebilmesi için hazırda bekletmeden önce sistem tarafından çağrılır. Bu, sistemin hazırda bekletme sırasında bu belleği düzgün bir şekilde yönetmesine ve hazırda bekletme modundan devam etmesine olanak tanır. (Bellek geç kaydedilir ve özgeçmiş sırasında çok erken çağrılacağı için erken yüklenir.)
KdInitializeController
NTSTATUS
KdInitializeController(
__in PVOID Adapter
)
/*++
Routine Description:
This function initializes the Network controller. The controller is setup
to send and recieve packets at the fastest rate supported by the hardware
link. Packet send and receive will be functional on successful exit of
this routine. The controller will be initialized with Interrupts masked
since all debug devices must operate without interrupt support.
Arguments:
Adapter - Supplies a pointer to the debug adapter object.
Return Value:
STATUS_SUCCESS on successful initialization. Appropriate failure code if
initialization fails.
--*/
Bu rutin, donanımı başlatmak için çağrılır. Sistem başlatıldığında ve KdShutdownController'ı çağırdığı düşük güç durumundan uyandığında çağrılır. Bu rutin, donanımın başlatma işleminin tamamen tamamlandığından ve döndürmeden önce paket göndermeye hazır olduğundan emin olmalıdır. Bu işlem, PHY'nin etkinleşmesini ve bağlantının kurulmasını beklemelidir. Bağlı bir kablo yoksa, bu rutinin süresiz olarak durmaması gerektiğini unutmayın. Bu rutin, KDNET ve bu genişletilebilirlik modülü arasında paylaşılan veri yapısında bağlantı hızını ve duplex modunu ayarlar. Ayrıca, donanım tarafından kullanılan MAC adresini KDNET paylaşılan veri yapısında TargetMacAddress tarafından işaret edilen konuma yazar.
KdShutdownController
VOID
KdShutdownController (
__in PVOID Adapter
)
/*++
Routine Description:
This function shuts down the Network controller. No further packets can
be sent or received until the controller is reinitialized.
Arguments:
Adapter - Supplies a pointer to the debug adapter object.
Return Value:
None.
--*/
Beklemede olan tüm veri paketlerinin gerçekten gönderilene kadar bu rutinin beklemesi ÇOK ÖNEMLİDİR. Bu yordamın, tüm iletim paketleri ana bellekten DMA ile aktarılana ve kablosu üzerinden iletilene kadar beklemesi, ondan sonra donanımın iletimini kapatması gerekir. Bekleyen tüm iletici paketler gönderildikten sonra, bu işlem donanımın tamamen kapatılması gerekir. Bu rutin, sistem kapandığında ve sistem hata ayıklama iletişimini düşük güç durumunda yönetmeye karar verdiğinde çağrılacaktır. Sistem bekleme, hazırda bekleme, uyku ve bağlı bekleme moduna geçtiğinde, sistem kapatıldığında buna ek olarak çağrılabilir.
KdGetDonanımBağlamBoyutu
ULONG
KdGetHardwareContextSize (
__in PDEBUG_DEVICE_DESCRIPTOR Device
)
/*++
Routine Description:
This function returns the required size of the hardware context in bytes.
Arguments:
Device - Supplies a pointer to the debug device descriptor.
Return Value:
None.
--*/
Bu yordam, donanımınızı desteklemek için gereken tüm bellek için gereken bayt sayısını döndürmelidir. Buna bağlam yapınız ve alma ve iletme için tüm paket arabelleklerinin yanı sıra donanım paket tanımlayıcıları ve diğer yapılar dahildir. gereken TÜM bellek boyutunun burada bildirilmesi gerekir. Donanımınızın paketler, paket tanımlayıcıları veya diğer yapılar için sahip olabileceği hizalama sınırlamaları için gereken ek bellekler dahil.
Hata ayıklama cihaz tanımlayıcısında Bellek Uzunluğu alanını ayarlarken bu yordamın KdInitializeLibrary yordamınız tarafından çağrılması gerektiğini unutmayın.
KdGetRxPacket
NTSTATUS
KdGetRxPacket (
__in PVOID Adapter,
__out PULONG Handle,
__out PVOID *Packet,
__out PULONG Length
)
/*++
Routine Description:
This function returns the next available received packet to the caller.
Arguments:
Adapter - Supplies a pointer to the debug adapter object.
Handle - Supplies a pointer to the handle for this packet. This handle
will be used to release the resources associated with this packet back
to the hardware.
Packet - Supplies a pointer that will be written with the address of the
start of the packet.
Length - Supplies a pointer that will be written with the length of the
received packet.
Return Value:
STATUS_SUCCESS when a packet has been received.
STATUS_IO_TIMEOUT otherwise.
--*/
Bu yordam, alınan ancak henüz işlenmemiş bir sonraki kullanılabilir paketi alır. Bu pakete ait bir tanıtıcı döndürür. Tanıtıcı, KdGetPacketAddress çağrısı yapılarak paketin adresini elde etmek ve KdGetPacketLength çağrısıyla da uzunluğunu almak için kullanılır. Paket ve kilit, KdReleaseRxPacket çağrısıyla paket serbest bırakılana kadar geçerli ve erişilebilir durumda kalmalıdır. Bu yordam ayrıca paket adresini ve uzunluğunu çağırana doğrudan döndürür.
Şu anda kullanılabilir paket yoksa bu yordam STATUS_IO_TIMEOUT ile hemen döndürülmelidir. Bu rutin bir paketin alınmasını beklememelidir. Handle'ın en üstteki 2 bitinin ayrılmış olduğunu unutmayın. TRANSMIT_HANDLE ve TRANSMIT_ASYNC her ikisi de net olmalıdır.
KdReleaseRxPacket
VOID
KdReleaseRxPacket (
__in PVOID Adapter,
ULONG Handle
)
/*++
Routine Description:
This function reclaims the hardware resources used for the packet
associated with the passed Handle. It reprograms the hardware to use those
resources to receive another packet.
Arguments:
Adapter - Supplies a pointer to the debug adapter object.
Handle - Supplies the handle of the packet whose resources should be
reclaimed to receive another packet.
Return Value:
None.
--*/
Bu rutin, başka bir paket almak için kullanılabilmesi için paket tanıtıcısı ile ilişkili kaynakları donanıma iade eder. Başarılı her KdGetRxPacket çağrısının ardından, KdGetRxPacket'ten döndürülen tanıtıcı ile KdReleaseRxPacket'e başka bir çağrı yapılır. KdReleaseRxPacket'in KdGetRxPacket başarılı olduktan hemen sonra çağrılacağının garanti edilmediğini unutmayın. İlk olarak başka bir KdGetRxPacket çağrısı yapılabilir. Ancak, her başarılı KdGetRxPacket çağrısının kaynakları, bir KdReleaseRxPacket çağrısıyla serbest bırakılacaktır.
Bu rutin, serbest bırakılan kaynakların başka bir paketin alınabilmesi için kullanılabilmesi amacıyla donanımı düzgün bir şekilde programlamalıdır.
KdGetTxPacket
NTSTATUS
KdGetTxPacket (
__in PVOID Adapter,
__out PULONG Handle
)
/*++
Routine Description:
This function acquires the hardware resources needed to send a packet and
returns a handle to those resources.
Arguments:
Adapter - Supplies a pointer to the debug adapter object.
Handle - Supplies a pointer to the handle for the packet for which hardware
resources have been reserved.
Return Value:
STATUS_SUCCESS when hardware resources have been successfully reserved.
STATUS_IO_TIMEOUT if the hardware resources could not be reserved.
STATUS_INVALID_PARAMETER if an invalid Handle pointer or Adapter is passed.
--*/
Bu yordam, bir sonraki kullanılabilir iletme kaynaklarını alır ve bunlara bir tanıtıcı döndürür. Bu tanıtıcı KdGetPacketAddress ve KdGetPacketLength'i çağırmak için kullanılır. KdGetPacketAddress tarafından döndürülen paket adresi, paketin içeriğini doğrudan yazmak için kullanılır. Paket adresi paketin başlangıcı olmalı ve uzunluk pakete yazılabilir bayt sayısı üst sınırı olmalıdır. Kullanılabilir donanım kaynağı yoksa, çünkü tüm donanım kaynakları alınmış ve henüz aktarılmamışsa, bu yordamın hemen STATUS_IO_TIMEOUT döndürmesi gerektiğini unutmayın.
TRANSMIT_HANDLE döndürülen kolda ayarlanmalıdır. handle öğesinin ilk iki bitinin TRANSMIT_ASYNC ve TRANSMIT_HANDLE bayrakları için ayrıldığını unutmayın.
KdSendTxPacket
NTSTATUS
KdSendTxPacket (
__in PVOID Adapter,
ULONG Handle,
ULONG Length
)
/*++
Routine Description:
This function sends the packet associated with the passed Handle out to the
network. It does not return until the packet has been sent.
Arguments:
Adapter - Supplies a pointer to the debug adapter object.
Handle - Supplies the handle of the packet to send.
Length - Supplies the length of the packet to send.
Return Value:
STATUS_SUCCESS when a packet has been successfully sent.
STATUS_IO_TIMEOUT if the packet could not be sent within 100ms.
STATUS_INVALID_PARAMETER if an invalid Handle or Adapter is passed.
--*/
Bu işlev, geçirilen tanıtıcıyla ilişkili paketi ağa gönderir. Handle'ın içinde gönderme işleminin zaman uyumsuz bir aktarım olup olmadığını gösteren ek bir bit kümesi olabileceğini unutmayın. tanıtıcıda TRANSMIT_ASYNC bayrağı ayarlanırsa, bu yordam donanımı paketi gönderecek şekilde programlamalı ve ardından donanımın göndermeyi tamamlanmasını beklemeden hemen geri dönmelidir. Bu, aktarım sırasında oluşan hataların kaybolacağı anlamına gelir. Bu sorun değil ve tasarım gereği paketler kabloda yine de kaybolabilir. TRANSMIT_ASYNC bayrağı Tanıtıcıda ayarlanmamışsa, bu yordam paket kabloya gönderilene kadar beklemeLI ve varsa iletim sırasında oluşan herhangi bir hata döndürmelidir. Döküm dosyaları hata ayıklayıcı konağına gönderilirken veya Windows ağ paketleri KDNET aracılığıyla KDNIC'ten gönderilirken TRANSMIT_ASYNC ayarlanacağına dikkat edin. Diğer tüm hata ayıklayıcı paketleri gönderildiğinde TRANSMIT_ASYNC temizlenir.
TRANSMIT_ASYNC kümesi TRUE olan bir paket kümesi ve ardından TRANSMIT_ASYNC ayarlı olmayan bir paket gönderilirse, önceki zaman uyumsuz paketlerin de gönderilmesini beklemesi gerekse bile donanım, bayrak kümesi olmayan paket gönderilene kadar beklemelidir.
KdGetPacketAddress
PVOID
KdGetPacketAddress (
__in PVOID Adapter,
ULONG Handle
)
/*++
Routine Description:
This function returns a pointer to the first byte of a packet associated
with the passed handle.
Arguments:
Adapter - Supplies a pointer to the debug adapter object.
Handle - Supplies a handle to the packet for which to return the
starting address.
Return Value:
Pointer to the first byte of the packet.
--*/
Bu rutin, belirtilen Tanıtıcıyla ilişkili paketin ilk baytına işaret eden bir işaretçi döndürür. Tanıtıcı'nın, iletim paketleri için TRANSMIT_HANDLE bitinin ve alma paketleri için TRANSMIT_HANDLE bitinin temiz olacağını unutmayın. Döndürülen işaretçi, işlemci tarafından okunabilen veya yazılabilir bir Windows sanal adresi olmalıdır. Bu adres, hata ayıklama cihaz tanımlayıcısı Bellek yapısına geçirilen KDNET genişletilebilirlik modülü için ayrılmış bellek bloğunun içinde olmalıdır. (KDNET genişletilebilirlik modülünün bu belleğe erişirken KdInitializeLibrary'de istediği bellek boyutundan daha fazlasını ASLA kullanmaması gerektiğini unutmayın. Bloğun sonundaki ek bellek KDNET tarafından kullanılmak üzere ayrılmıştır ve KDNET genişletilebilirlik modülüne dokunmamalıdır.)
KdGetPacketLength
ULONG
KdGetPacketLength (
__in PVOID Adapter,
ULONG Handle
)
/*++
Routine Description:
This function returns the length of the packet associated with the passed
handle.
Arguments:
Adapter - Supplies a pointer to the debug adapter object.
Handle - Supplies a handle to the packet for which to return the
length.
Return Value:
The length of the packet.
--*/
Bu işlev, verilen Tanıtıcı ile ilişkili paketin bayt cinsinden uzunluğunu döndürür. Tanıtıcı'nın, iletim paketleri için TRANSMIT_HANDLE bitinin ayarlandığını ve alma paketleri için TRANSMIT_HANDLE bitinin temizlendiğini unutmayın. İletim paketleri için, bu uzunluk pakete yazılabilir bayt sayısı üst sınırı olmalıdır. Alma paketleri için bu uzunluk, alınan paketteki gerçek bayt sayısı olmalıdır.
KDNET Genişletilebilirlik Modüllerinde Hata Ayıklama
KDNET genişletilebilirlik modülünde hata ayıklamak için, hedef makinede yükseltilmiş bir komut isteminden aşağıdaki bcdedit komutlarını çalıştırmanız gerekir.
İlk olarak ve en önemlisi, Winload'un hata ayıklayıcıya giren ve normal önyüklemeyi önleyen özel bir hata yoluna gitmeden yinelenen önyükleme hatalarına izin verdiğinden emin olmak için aşağıdaki iki komutu çalıştırmanız gerekir. Bu komutları çalıştırmak, makineyi tekrar tekrar yeni bitlerle yeniden başlatmanıza ve bu yeni bitlerin hatalarını sorunsuzca ayıklamanıza olanak sağlar.
Bcdedit -set {current} BootStatusPolicy IgnoreAllFailures
Bcdedit -set {current} RecoveryEnabled No
Genişletilebilirlik modülünde hata ayıklamak için hedef makinede com1 üzerinde seri hata ayıklama kullanacağınızı varsayarsak, aşağıdakileri yapın.
bcdedit -dbgsettings serial debugport:1 baudrate:115200
Bu, com1'de varsayılan hata ayıklama aktarımını 115200 baud konumunda seri olarak ayarlar. Bu ayarlar önyükleme hata ayıklaması için de kullanılır.
bcdedit -debug on
Bu, çekirdek hata ayıklamasını etkinleştirir.
bcdedit -bootdebug on
Bu, winload.exeüzerinde önyükleme hata ayıklamasını etkinleştirir; bu işlevsellik, KDNET genişletilebilirlik modülünüz dahil olmak üzere çekirdeğin erken başlatma aşamasında hata ayıklamak için kullanılacaktır.
bcdedit -set kerneldebugtype net
Bu, varsayılan hata ayıklama aktarım ayarlarından bağımsız olarak çekirdek hata ayıklama türünü 'net'e zorlar. Bu, winload.exe'ın çekirdek hata ayıklama aktarımı olarak kdnet.dll'i yüklemesine neden olur.
bcdedit -set kernelbusparams b.d.f
Burada b veri yolu numarasıdır, d cihaz numarasıdır ve f ise KDNET ekstensiblite modülünü yazmakta olduğunuz donanımın işlev numarasıdır (tümü ondalık). Bu sayılar, donanımın bulunduğu PCI yuvasına bağlıdır. Windows cihaz yöneticisindeki ağ cihazının cihaz özellikleri sayfasında konum dizesini bularak bunları bulabilirsiniz. Windows cihaz yöneticisini açın, ağ cihazlarına çift tıklayın, cihazınızı bulun, çift tıklayın ve açılan pencerede PCI veri yolu üzerindeki donanımın veri yolunu, cihazını ve işlevini içeren bir Konum: alanı olmalıdır. Bu bilgilerin maskelenmiş olmasına neden olan bir otobüs sürücünüz varsa, sürücülerinizden veya başka bir şekilde konumu belirlemeniz gerekir.
Bu, çekirdek busparamlarını b.d.f'ye zorlar; bu da söz konusu cihazı çekirdek hata ayıklama cihazı olarak seçilmeye zorlar.
bcdedit -set kernelhostip N
Burada N, aşağıdaki formül tarafından belirlenir. Konak hata ayıklayıcı makinenizin IPv4 adresi w.x.y.z ise, N = (w0x01000000) + (x0x00010000) + (y0x00000100) + (z0x00000001). Komut satırında onaltılık değil, ondalık olarak N belirtilmelidir. IPv4 adresinin her baytını etkili bir şekilde alır ve onaltılık olarak birleştirerek 32 bitlik bir sayı oluşturursunuz, daha sonra bunu ondalık sisteme çevirirsiniz.
bcdedit -set kernelport N
Burada N 50000 veya iç ağınızda engellenmeyen başka bir bağlantı noktasıdır.
Bu, KDNET'i ağ hata ayıklama bağlantı noktası olarak N bağlantı noktasını kullanmaya zorlar.
bcdedit -set kernelkey 1.2.3.4
Bu, KDNET hata ayıklama anahtarını 1.2.3.4'e zorlar. 1.2.3.4, ağda güvenli veya benzersiz bir anahtar değildir. Hedef bilgisayarı güvenli tutmak için, konak ve hedef bilgisayarlar arasında seyahat eden paketler şifrelenmelidir. Otomatik olarak oluşturulan bir şifreleme anahtarı kullanmanızı kesinlikle öneririz. Daha fazla bilgi için bkz . KDNET Ağ ÇekirdeğiNde Hata Ayıklamayı Otomatik Olarak Ayarlama.
bcdedit -set kerneldhcp on
Bu, KDNET çekirdek dhcp ayarını açık hale getirir.
Konak makinede seri hata ayıklama bağlantı noktanız olarak com1 kullandığınızı varsayarak hata ayıklayıcınızı aşağıdaki komut satırıyla hata ayıklayıcı konak makinesinde çalıştırın:
windbg -d -k com:port=com1,baud=115200
Bu, hata ayıklayıcıyı çalıştırır ve windbg önyükleme hata ayıklayıcısı konak makineyle ilk kez iletişim kurarken hata ayıklamanın bozulmasına neden olur.
Ardından bir komut veya program çalıştırarak hedef makineyi yeniden başlatın.
shutdown -r -t 0
Hata ayıklayıcı windbg moduna girdiğinde, winload için sembollerin yüklendiğinden emin olun. (.sympath değerini ayarlamanız ve .reload işlemi yapmanız gerekebilir). Ardından x winload!*deb*tra* komutunu çalıştırın. Listelenen simgelerden biri BdDebugTransitions gibi olacaktır.
Ardından komutunu çalıştırın ed winload!BdDebugTransitions 1, ancak doğru simge adını kullandığınızdan emin olun.
Ardından bir bu winload!blbdstop kesme noktası ayarlamak için komutunu çalıştırın.
Ardından gitmek için g tuşuna bas.
Winload'a zorla girmen lazım! BlBdStop.
Ardından aşağıdaki komutları çalıştırın.
bu nt!KdInitSystem
bu kdnet!KdInitialize
bu kdstub!KdInitializeLibrary
KDNET genişletilebilirlik modülünüzde kesme noktaları ayarlarken büyük olasılıkla kdstub kullanacağınızı unutmayın; bu işe yaramazsa
bu kd_YY_XXXX!KdInitializeLibrary
Burada YY, PCI sınıfınız, XXXX ise PCI VID'nizdir. (örneğin: KDNET genişletilebilirlik modülünüzün adını kullanın.)
Hata ayıklayıcıda genellikle genişletilebilirlik modülünüzün gerçek adını kullanmak yerine kdstub kullanmanız gerekir.
Ardından kesme noktalarını listelemek için komutunu çalıştırın bl . Durak noktalarının yerinde olduğundan emin olun (hepsinin yanında bir e olmalıdır).
Ardından tuşuna tıklayın g. nt!KdInitSystem kesme noktasına ulaşmalısın.
Tekrar g tuşuna bas ve kdnet!KdInitialize'a ulaşabilirsiniz.
Tekrar g tuşuna basın ve kendi modülünüzde KdInitializeLibrary'de bir kesme noktasına ulaşmalısınız.
Ardından InitializeController yordamınızda ve diğer tüm yordamlarınızda bir kesme noktası ayarlayabilir ve kodunuzda adım adım ilerleyebilirsiniz.
KdInitializeLibrary'yi adım adım ilerlettikten sonra 'g' komutunu çalıştırın ve InitializeController rutininizde bir kesme noktası ayarlayın, bu, bir sonraki adımda çalışacaktır.
İşlem tamamlandıktan sonra KdGetTxPacket, KdSendTxPacket, KdGetRxPacket, KdReleaseRxPacket yordamlarınızda kesme noktaları ayarladığınızdan ve g tuşuna yeniden bastığınızdan emin olun; bu yordamlar önyükleme sırasında KDNET tarafından yapılan ağ başlatma işlemi kapsamında çalıştırılır.
Tüm yordamlarınızın çağrıldığından emin olmak için KdInitializeLibrary veya KdInitializeController yordamlarınıza gerektiğinde geçici kod eklemeniz gerekebilir, böylece tüm kodunuz üzerinde adım adım ilerleyebilirsiniz. (Örneğin, işler normal çalıştığında başlatma sırasında KdShutdownController çağrılmaz, bu nedenle adım adım ilerleyebilmek ve doğru olduğundan emin olmak için geçici koddan açıkça çağırmanız gerekir.)
Kodunuzun tamamını adım adım inceleyip doğru olduğundan emin olduktan sonra hedefi yeniden başlatın, ancak winload!BdDebugTransitions bayrağını true olarak ayarlamayın (varsayılan olarak sıfırda bırakın).
Ardından konak hata ayıklayıcı makinenizde çekirdek hata ayıklayıcısının başka bir örneğini de çalıştırın.
Windbg -d -k net:port=50000,key=1.2.3.4
Hedef makine önyüklemesine izin verin ve ağ üzerinden çekirdek hata ayıklayıcısının diğer örneğine bağlanmalıdır.
Ardından, çekirdek hata ayıklayıcısında komutları çalıştırın ve çalıştığından emin olun, ardından hedefin önyüklemeye devam etmesine izin verin ve daha sonra içeri girip komutları çalıştırabileceğinizden emin olun.
Uyarı
Ayıklama geçişleri bayrağını winload olarak ayarlamak, Windows'un ÖNYÜKLEMEMESİNİ GARANTİ eder. Bu bayrağı ayarladıktan sonra Windows'un önyüklemeyi bitirmesine izin verme girişiminde bulunursanız, Windows çöker veya donar. Windows'un başarıyla başlatılmasını istiyorsanız, hata ayıklama geçiş bayrağını ayarlayamazsınız. bayrağını ayarlamak, hata ayıklayıcıda adım adım ilerleyerek kodunuzun hatalarını ayıklamanıza ve doğru olduğunu doğrulamanıza olanak tanır, ancak sonuçta hata ayıklamanın normal önyükleme sırasında çalıştığını doğrulayabilmeniz için bayrağı ayarlamamalısınız. Bu, sistemi normal bir şekilde önyüklerken kodunuzda adım adım ilerleyemeyeceğiniz anlamına gelir ve aslında Windows normal çalıştığında, donanımınızda hata ayıklama etkinleştirildiğinde KDNET genişletilebilirlik modülünüz hata ayıklanamaz. Çekirdek hata ayıklayıcısıyla hata ayıklama girişimi makinenin kilitlenmesine neden olur. (Çekirdek hata ayıklama yollarında çalışan kodda kesme noktaları ayarlayamazsınız; bunun nedeni sonsuz yeniden giriş, üfleme yığını ve yeniden başlatmadır.)
Çoklu Fiziksel Fonksiyon - 2PF
KDNET genişletilebilirliğine ek olarak, KDNET, PCI yapılandırma alanını bölümleyerek desteklenen NIC'lerde birden çok Fiziksel İşlev (PF) kullanarak çekirdek hata ayıklamasını destekler. Ağ kartı satıcılarının bu özellik için desteği etkinleştirmesi tavsiye edilir. Daha fazla bilgi için bkz. Hata Ayıklayıcı 2PF KDNET MiniPort Ağ Sürücüsü Desteği.
Ayrıca bkz.
Otomatik olarak KDNET Ağ Çekirdeği Hata Ayıklamasını Ayarlama
KDNET Ağ Çekirdeği Hata Ayıklama Ayarlarını Elle Yapılandırma