Verwenden des Kernelstapels

Die Größe des Kernelmodusstapels ist auf ungefähr drei Seiten beschränkt. Daher können Treiber beim Übergeben von Daten an interne Routinen keine großen Datenmengen im Kernelstapel übergeben.

Verwenden Sie die folgenden Entwurfsrichtlinien, um zu vermeiden, dass der Stapelspeicher im Kernelmodus nicht mehr verfügbar ist:

  • Vermeiden Sie tief geschachtelte Aufrufe von einer internen Treiberroutine an eine andere, wenn jede Routine Daten im Kernelstapel übergibt.

  • Stellen Sie sicher, dass Sie die Anzahl rekursiver Aufrufe begrenzen, die auftreten können, wenn Sie einen Treiber entwerfen, der über eine rekursive Routine verfügt.

Anders ausgedrückt: Die Aufrufstruktur eines Treibers sollte relativ flach sein. Sie können die Routinen IoGetStackLimits und IoGetRemainingStackSize aufrufen, um den verfügbaren Kernelstapelspeicher zu bestimmen, oder KeExpandKernelStackAndCallout , um ihn zu erweitern. Beachten Sie, dass die Größe des Kernelmodusstapels zwischen verschiedenen Hardwareplattformen und verschiedenen Versionen des Betriebssystems variieren kann.

Wenn der Kernelstapelspeicher nicht mehr verfügbar ist, wird ein schwerwiegender Systemfehler verursacht. Daher ist es für einen Treiber besser, Systemspeicher zuzuweisen , als den Kernelstapelspeicher zu belegen. Der nicht auslagerte Pool ist jedoch auch eine eingeschränkte Systemressource.

Im Allgemeinen befindet sich der Kernelmodusstapel im Arbeitsspeicher, kann jedoch gelegentlich ausgelagert werden, wenn der Thread in einen Wartezustand wechselt, der den Benutzermodus angibt. Informationen zum vorübergehenden Deaktivieren des Kernelstapel-Pagings für den aktuellen Thread finden Sie unter KeSetKernelStackSwapEnable . Aus Leistungsgründen wird nicht empfohlen, das Kernelstapel-Paging global zu deaktivieren. Wenn Sie dies jedoch während einer Debugsitzung tun möchten, lesen Sie Deaktivieren des Pagings von Kernelstapeln.

Da der Kernelstapel möglicherweise ausgelagert wird, sollten Sie beim Übergeben von stapelbasierten Puffern (d. h. lokalen Variablen) an DMA oder eine Routine, die mit DISPATCH_LEVEL oder höher ausgeführt wird, vorsichtig sein.