Megosztás:


A kernelverem használata

A kernelmódban futó verem mérete körülbelül három lapra korlátozódik. Ezért amikor belső rutinoknak ad át adatokat, az illesztőprogramok nem tudnak nagy mennyiségű adatot átadni a kernelveremen.

A kernel módú veremterület elfogyásának elkerülése érdekében kövesse az alábbi tervezési irányelveket:

  • Ne kezdeményezzenek mélyen beágyazott hívásokat az egyik belső illesztőprogram rutinjából a másikba, ha minden rutin adatokat ad át a kernelveremen.

  • Győződjön meg arról, hogy korlátozza a rekurzív hívások számát, ha rekurzív rutinnal rendelkező illesztőprogramot tervez.

Más szóval az illesztőprogram hívásfa struktúrájának viszonylag laposnak kell lennie. Meghívhatja az IoGetStackLimits és az IoGetRemainingStackSize rutinokat a rendelkezésre álló kernelveremterület meghatározásához, vagy a KeExpandKernelStackAndCallout parancsmag kibontásához. Vegye figyelembe, hogy a kernel módú verem mérete eltérő lehet a különböző hardverplatformok és az operációs rendszer különböző verziói között.

A kernel veremterület kifogyása végzetes rendszerhibát okoz. Ezért jobb, ha egy illesztő rendszertér-memóriát foglal le, mint hogy kifusson a kernel veremterületből. A nem lapozott készlet szintén egy korlátozott rendszererőforrás.

A kernel módú verem általában a memóriában található, de időnként ki is lapozódhat, ha a szál a felhasználói módot meghatározó várakozási állapotba kerül. Az aktuális szál kernelverem-lapozásának ideiglenes letiltásáról a KeSetKernelStackSwapEnable című témakörben olvashat. Teljesítménybeli okokból nem ajánlott globálisan letiltani a kernelverem lapozását, de ha ezt hibakeresési munkamenet során szeretné megtenni, olvassa el a kernelverem lapozásának letiltása című témakört.

Mivel előfordulhat, hogy a kernelverem kilapozásra kerülhet, legyen óvatos a veremalapú pufferek (például helyi változók) DMA-nak való átadásával, vagy bármely olyan rutinnal kapcsolatban, amely DISPATCH_LEVEL vagy annál magasabb szinten fut.