Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az NT-alapú operációs rendszeren az illesztőprogramok többszálúak; egyszerre több I/O-kérést is fogadhatnak különböző szálakról. Az illesztőprogram tervezésekor feltételezni kell, hogy az SMP-rendszeren fog futni, és meg kell tennie a megfelelő intézkedéseket az adatintegritás biztosítása érdekében.
Pontosabban, amikor egy illesztőprogram megváltoztatja a globális vagy a fájlobjektum adatait, zárolást vagy összekapcsolt műveletsorozatot kell használnia a versenyfeltételek elkerülése érdekében.
Versenyhelyzettel találkozik, amikor globális vagy fájlobjektum-specifikus adatokra hivatkozik
A következő kódrészletben versenyállapot léphet fel, ha a sofőr a Data.LpcInfo-ban fér hozzá a globális adatokhoz:
PLPC_INFO pLpcInfo = &Data.LpcInfo; //Pointer to global data
...
...
// This saved pointer may be overwritten by another thread.
pLpcInfo->LpcPortName.Buffer = ExAllocatePool(
PagedPool,
arg->PortName.Length);
A kódba egy IOCTL-hívás eredményeként beírt több szál memóriavesztést okozhat a mutató felülírása során. A probléma elkerülése érdekében az illesztőprogramnak az ExInterlockedXxx rutint vagy valamilyen típusú zárolást kell használnia a globális adatok módosításakor. A vezető követelményei határozzák meg a zár elfogadható típusait. További információ: Spin Locks, Kernel Dispatcher Objects és ExAcquireResourceSharedLite.
Az alábbi példa egy fájlspecifikus puffert (Endpoint-LocalAddress>) kísérel meg újratelepíteni a végpontcím tárolásához:
Endpoint = FileObject->FsContext;
if ( Endpoint->LocalAddress != NULL &&
Endpoint->LocalAddressLength <
ListenEndpoint->LocalAddressLength ) {
FREE_POOL (Endpoint->LocalAddress,
LOCAL_ADDRESS_POOL_TAG
);
Endpoint->LocalAddress = NULL;
}
if ( Endpoint->LocalAddress == NULL ) {
Endpoint->LocalAddress =
ALLOCATE_POOL (NonPagedPool,
ListenEndpoint->LocalAddressLength,
LOCAL_ADDRESS_POOL_TAG);
}
Ebben a példában versenyállapot léphet fel a fájlobjektumhoz való hozzáféréssel. Mivel az illesztőprogram nem rendelkezik zárolásokkal, ugyanazon fájlobjektum két kérése is beírhatja ezt a függvényt. Az eredmény lehet hivatkozás felszabadított memóriára, többszörös kísérlet ugyanazon memória felszabadítására, vagy memóriaszivárgás. Ezeknek a hibáknak a elkerülése érdekében a két ha utasítást egy spin-zárban kell rögzíteni.