Windows kernel módú folyamat és szálkezelő

A rendszer által biztosított Windows kernel módú folyamat és szálkezelő vezérli a folyamatok és szálak végrehajtását a Windows operációs rendszerben. Ennek a kezelőnek a megértése elengedhetetlen a kernel módú illesztőprogram-fejlesztők számára, akiknek szálakat kell létrehozniuk, figyelnie kell a folyamatlétrehozási folyamatot, vagy szinkronizálnia kell a megosztott erőforrásokhoz való hozzáférést.

Az ObCallback-illesztő mintája bemutatja, hogyan használhat folyamat- és szálértesítési rutinokat egy kernel módú illesztőprogramban.

Folyamatok és szálak áttekintése

A folyamat olyan szoftverprogram, amely jelenleg Windows rendszeren fut, és amelyet egy egyedi folyamatazonosító (PID) azonosít. Minden folyamaton belül egy vagy több szál a program kódját futtató tényleges végrehajtási egységeket jelöli. Minden szál egyedi szálazonosítóval (TID) is rendelkezik a folyamaton belül.

A szálak a processzoridő megosztásával teszik lehetővé a többfeladatos munkavégzést. Egy processzoros gépen több szál is létrehozható, de egyszerre mindig csak egy hajtható végre. A processzor gyorsan vált a szálak között, ami az egyidejű végrehajtás illúzióját kelti. Többprocesszoros rendszereken a valódi párhuzamos végrehajtás akkor történik, ha a szálak egyszerre futnak különböző processzorokon.

A Windows kernel módú folyamata és a szálkezelő kezeli a folyamat összes szálának végrehajtását. Akár egy processzorral, akár több processzorral rendelkezik, nagy figyelmet kell fektetni az illesztőprogram-programozásba, hogy a folyamat összes szála úgy legyen megtervezve, hogy függetlenül attól, hogy milyen sorrendben kezeli a szálakat, az illesztőprogram megfelelően működjön.

Ha a különböző folyamatok szálai egyszerre próbálják meg ugyanazt az erőforrást használni, problémák léphetnek fel. A Windows számos módszert kínál a probléma elkerülésére. Azt a technikát, amely biztosítja, hogy a különböző folyamatok szálai ne érje el ugyanazt az erőforrást, szinkronizálásnak nevezzük. További információ a szinkronizálásról: Szinkronizálási technikák.

Olyan rutinok, amelyek közvetlen felületet biztosítanak a folyamathoz és a szálkezelőhöz, általában a "Ps" előtaggal kezdődnek; például PsCreateSystemThread. A kernel DDI-k listáját a Windows rendszermag című témakörben találja.

Ez az irányelv-készlet a következő visszahívási rutinokra vonatkozik:

Kövesse az alábbi ajánlott eljárásokat:

  • A rutinok rövidek és egyszerűek maradnak.
  • Ne kezdeményezz hívásokat felhasználói módú szolgáltatásba a folyamat, a szál vagy a rendszerkép ellenőrzéséhez.
  • Ne végezz el registry hívásokat.
  • Ne kezdeményezz blokkoló és/vagy folyamatközi kommunikációs (IPC) függvényhívásokat.
  • Ne szinkronizáljon más szálakkal, mert az újbemeneteli holtponthoz vezethet.
  • Használja a rendszer szálait a munkák sorba állításához, különösen az alábbi munkákhoz:
    • Lassú API-k vagy API-k, amelyek más folyamatokba hívnak be.
    • Minden olyan blokkolási viselkedés, amely megszakíthatja a szálakat az alapvető szolgáltatásokban.
  • Ha rendszermunkaszálakat használ, ne várjon a munka befejezésére. Ha így tesz, azzal az aszinkron módon befejezendő munka sorba állításának célját nem teszi lehetővé.
  • Vegye figyelembe a kernel módú veremhasználat ajánlott eljárásait. Példákért lásd: Hogyan akadályozhatom meg, hogy az illesztőprogramom kifusson a kernel-módú veremből? és Fontos illesztőprogram-fogalmak és tippek.

Alrendszerfolyamatok

A Windows 10-től kezdve a Linux Windows-alrendszere (WSL) lehetővé teszi, hogy a felhasználó natív Linux ELF64 bináris fájlokat futtasson a Windowson a többi Windows-alkalmazás mellett. A WSL-architektúráról, valamint a bináris fájlok futtatásához szükséges felhasználói és kernel módú összetevőkről a linuxos Windows-alrendszer blog bejegyzéseiből tájékozódhat.

Az egyik összetevő egy olyan alrendszerfolyamat , amely a nem módosított felhasználói módú Linux-bináris, például a /bin/bash binárist üzemelteti. Az alrendszerfolyamatok nem tartalmaznak Win32-folyamatokhoz társított adatstruktúrákat, például folyamatkörnyezeti blokkot (PEB) és szálkörnyezeti blokkot (TEB). Az alrendszerfolyamatok esetében a rendszerhívások és a felhasználói mód kivételei egy párosított illesztőprogramnak lesznek elküldve.

Az alrendszerfolyamatok támogatásához a folyamat- és szálkezelői rutinok az alábbiak:

  • A WSL-típust az SubsystemInformationTypeWSL értéke jelzi a SUBSYSTEM_INFORMATION_TYPE enumerálásban. Az illesztőprogramok használhatják a NtQueryInformationProcess és a NtQueryInformationThread függvényeket, az alapul szolgáló alrendszer meghatározásához. Ezek a hívások SubsystemInformationTypeWSL eredményt adnak a WSL-re vonatkozóan.

  • Más kernelmódú illesztőprogramok értesítést kaphatnak az alrendszer-folyamatok létrehozásáról/törléséről a visszahívási rutin regisztrálásával a PsSetCreateProcessNotifyRoutineEx2 híváson keresztül. A szálak létrehozásáról/törléséről szóló értesítések megkapásához az illesztőprogramok meghívhatják PsSetCreateThreadNotifyRoutineEx, és az értesítés típusaként meg kell adniuk a PsCreateThreadNotifySubsystems-t.

  • A PS_CREATE_NOTIFY_INFO struktúrát kiterjesztettük egy IsSubsystemProcess tagra, amely a Win32-től eltérő alrendszert jelöl. Más tagok, például FileObject, ImageFileName, CommandLine további információkat jeleznek az alrendszer folyamatáról. A tagok viselkedéséről további információt lásd: SUBSYSTEM_INFORMATION_TYPE.