Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sterowniki, które muszą dynamicznie przydzielać bufory o stałym rozmiarze, aby wykonywać operacje we/wy na żądanie, mogą używać rutyn wsparcia ExXxxLookasideListEx lub ExXxxLookasideList. Po tym jak sterownik zainicjuje swoją listę lookaside, system operacyjny będzie przechowywać w liście lookaside sterownika pewną liczbę dynamicznie przydzielonych buforów o określonym rozmiarze, przez co efektywnie rezerwuje zestaw wielokrotnie używanych buforów o stałym rozmiarze dla sterownika. Format i zawartość buforów o stałym rozmiarze sterownika (nazywanych również wpisami) na jego liście pomocniczej są określane przez sterownik.
Na przykład sterowniki klasy pamięci, które muszą skonfigurować bloki żądań SCSI (SRB) dla podstawowych sterowników portów/miniportów SCSI, używają list zapasowych. Taki sterownik klasy przydziela dla baz danych SRB zgodnie z potrzebami z listy lookaside i zwalnia każdy bufor SRB z powrotem do listy lookaside listy lookaside do ponownego użycia za każdym razem, gdy SRB zostanie zwrócony do sterownika klasy w ukończonym IRP. Ponieważ sterownik klasy pamięci masowej nie może z góry określić, ile SRB musi używać w dowolnym momencie, ponieważ zapotrzebowanie na wejście/wyjście na sterownik wzrasta i maleje, lista lookaside jest wygodnym i ekonomicznym sposobem zarządzania alokacją i dealokacją buforów o stałym rozmiarze dla SRB w takim sterowniku.
System operacyjny zachowuje stan wszystkich stronicowanych i niestronicowanych list lookaside, które są obecnie używane, śledząc dynamicznie zapotrzebowanie na alokacje i dealokacje wpisów na wszystkich listach oraz dostępną pulę systemową przeznaczoną na nowe wpisy. Gdy zapotrzebowanie na alokacje jest wysokie, system operacyjny zwiększa liczbę wpisów przechowywanych na każdej liście odnośników. Gdy zapotrzebowanie spadnie ponownie, zwalnia nadmiarowe wpisy lookaside z powrotem do puli systemu.
Listy lookaside są bezpieczne dla wielu wątków. Lista lookaside ma wbudowaną synchronizację, która umożliwia jednoczesne działanie wielu wątków w sterowniku, aby wspólnie korzystać z listy lookaside. Te wątki mogą bezpiecznie przydzielać bufory z udostępnionej listy chwilowego zapisu i zwalniać te bufory do listy bez konieczności jawnego synchronizowania tych operacji przez sterownik. Jednak aby uniknąć możliwych przecieków i uszkodzenia danych, zestaw wątków, które współużytkuje listę lookaside, musi jawnie zsynchronizować inicjowanie i usunięcie listy.
Listy Lookaside interfejsów
Począwszy od systemu Windows Vista, struktura LOOKASIDE_LIST_EX opisuje listę lookaside, która może zawierać stronicowane lub niestronicowane bufory. Jeśli sterownik udostępnia niestandardowe procedury przydzielania i zwalniania dla tej listy lookaside, te procedury otrzymują kontekst prywatny jako parametr wejściowy. Sterownik może używać tego kontekstu do zbierania prywatnych danych dla listy lookaside. Na przykład kontekst może służyć do zliczenia liczby wpisów listy, które są dynamicznie przydzielane i zwalniane przez listę. Aby zapoznać się z przykładem kodu pokazującym, jak używać kontekstu w ten sposób, zobacz ExInitializeLookasideListEx.
Następujące procedury systemowe obsługują listy lookaside opisane przez strukturę LOOKASIDE_LIST_EX:
Począwszy od systemu Windows 2000, struktura PAGED_LOOKASIDE_LIST opisuje listę lookaside zawierającą stronicowane bufory. Jeśli sterownik udostępnia niestandardowe procedury Przydziel i Bezpłatnie dla tej listy odnośników, te procedury nie odbierają kontekstu prywatnego jako parametru wejściowego. Z tego powodu, jeśli sterownik ma być uruchamiany tylko w systemie Windows Vista i nowszych wersjach systemu Windows, rozważ użycie struktury LOOKASIDE_LIST_EX zamiast struktury PAGED_LOOKASIDE_LIST dla list odnośników. Następujące rutyny dostarczane przez system obsługują listy lookaside opisane przez strukturę PAGED_LOOKASIDE_LIST:
ExAllocateFromPagedLookasideList
ExInitializePagedLookasideList
Począwszy od systemu Windows 2000, struktura NPAGED_LOOKASIDE_LIST opisuje listę podręczną zawierającą niestronicowane bufory. Jeśli sterownik udostępnia niestandardowe procedury Przydziel i Bezpłatnie dla tej listy odnośników, te procedury nie odbierają kontekstu prywatnego jako parametru wejściowego. Jeśli twój sterownik ma być uruchamiany tylko w systemie Windows Vista i nowszych wersjach systemu Windows, rozważ użycie struktury LOOKASIDE_LIST_EX zamiast struktury NPAGED_LOOKASIDE_LIST dla list lookaside. Następujące procedury dostarczone przez system obsługują listy lookaside opisane przez NPAGED_LOOKASIDE_LIST struktury:
ExAllocateFromNPagedLookasideList
ExInitializeNPagedLookasideList
Wytyczne dotyczące implementacji
Aby zaimplementować listę lookaside używającą struktury LOOKASIDE_LIST_EX , postępuj zgodnie z następującymi wytycznymi projektowymi:
Wywołaj funkcję ExInitializeLookasideListEx, aby skonfigurować listę lookaside. W tym wywołaniu określ, czy wpisy na liście lookaside mają być stronicowane, czy niestronicowane. Użyj innych niż stronicowane, jeśli sam sterownik lub jakikolwiek źródłowy sterownik, do którego przekazuje wpisy listy odnośników, mogą uzyskać dostęp do tych wpisów w irQL >= DISPATCH_LEVEL. Użyj stronicowanych tylko wtedy, gdy dostęp do wpisów listy lookaside sterownika zawsze występuje w IRQL <= APC_LEVEL.
Struktura LOOKASIDE_LIST_EX listy lookaside musi zawsze znajdować się w niestronicowanej pamięci systemowej niezależnie od tego, czy wpisy na liście są stronicowane, czy niestronicowane.
Aby uzyskać lepszą wydajność, przekaż wskaźniki NULL dla parametrów Przydziel i Bezpłatnie do elementu ExInitializeLookasideListEx , chyba że procedury alokacji i cofania alokacji muszą wykonywać więcej niż tylko przydzielać i zwalniać pamięć dla wpisów listy odnośników. Na przykład te procedury mogą rejestrować informacje o użyciu sterowników dynamicznie przydzielonych.
Podana przez sterownik procedura przydzielenia może przekazać parametry wejściowe (PoolType, Tag i Size), które otrzymuje bezpośrednio do procedury ExAllocatePoolWithTag lub ExAllocatePoolWithQuotaTag, aby przydzielić nowy bufor.
Dla każdego wywołania ExAllocateFromLookasideListEx, wykonaj wzajemne wywołanie do ExFreeToLookasideListEx tak szybko, jak to możliwe, gdy wcześniej przydzielony wpis nie jest już używany.
Dostarczanie procedur Przydziel i Zwolnij, które nie robią nic więcej niż wywołanie odpowiednio ExAllocatePoolWithTag i ExFreePool, marnuje cykle procesora. ExAllocateFromLookasideListEx wykonuje niezbędne wywołania ExAllocatePoolWithTag i ExFreePool automatycznie, gdy sterownik przekazuje NULLAllocate i Free wskaźniki do ExInitializeLookasideListEx.
Każda procedura przydzielania nie może przydzielić pamięci dla wpisu ze stronicowanej puli, która ma być przechowywana na liście odnośników niestronicowanych lub na odwrót. Musi również przydzielić wpisy o stałym rozmiarze, ponieważ każde kolejne wywołanie sterownika do exAllocateFromLookasideListEx zwraca pierwszy wpis obecnie przechowywany na liście lookaside, chyba że lista jest pusta. Oznacza to, że wywołanie funkcji ExAllocateFromLookasideListEx powoduje wywołanie procedury przydzielenia dostarczonej przez sterownik tylko wtedy, gdy dana lista lookaside jest obecnie pusta. W związku z tym przy każdym wywołaniu funkcji ExAllocateFromLookasideListEx zwrócony wpis będzie dokładnie taki, jakiego potrzebuje sterownik tylko wtedy, gdy wszystkie wpisy na liście lookaside mają stały rozmiar. Podana przez sterownik rutyna Przydziel nie powinna również zmieniać wartości Tag, którą sterownik pierwotnie przekazał do ExInitializeLookasideListEx, ponieważ zmiany w wartości puli Tag utrudnią debugowanie i śledzenie użycia pamięci sterownika.
Wywołania do funkcji ExFreeToLookasideListEx przechowują wcześniej przydzielone wpisy na liście lookaside, chyba że lista jest już pełna (tj. zawiera maksymalną liczbę wpisów określoną przez system). Aby uzyskać lepszą wydajność, sterownik powinien wykonać wzajemne wywołanie exFreeToLookasideListEx tak szybko, jak to możliwe dla każdego wywołania, które wykonuje exAllocateFromLookasideListEx. Gdy sterownik zwalnia wpisy z powrotem do listy lookaside, to następne wywołanie tego sterownika do ExAllocateFromLookasideListEx jest znacznie mniej prawdopodobne, aby spowodować karę wydajności dynamicznego przydzielania pamięci dla nowego wpisu.
Podobne wytyczne dotyczą listy odnośników używającej struktury PAGED_LOOKASIDE_LIST lub NPAGED_LOOKASIDE_LIST .