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.
Począwszy od systemu Windows 8.1, sterowniki mogą używać procedur czasomierza ExXxxdo zarządzania czasomierzami o wysokiej rozdzielczości. Dokładność czasomierza o wysokiej rozdzielczości jest ograniczona tylko przez maksymalną obsługiwaną rozdzielczość zegara systemowego. Natomiast czasomierze ograniczone do domyślnej rozdzielczości zegara systemowego są znacznie mniej dokładne.
Jednak czasomierze o wysokiej rozdzielczości wymagają, aby przerwania zegara systemowego — przynajmniej tymczasowo — zachodziły z większą częstotliwością, co zwykle zwiększa zużycie energii. W związku z tym sterowniki powinny używać czasomierzy o wysokiej rozdzielczości tylko wtedy, gdy dokładność czasomierza jest niezbędna i używać czasomierzy rozdzielczości domyślnej we wszystkich innych przypadkach.
Aby utworzyć czasomierz o wysokiej rozdzielczości, sterownik WDM wywołuje procedurę ExAllocateTimer i ustawia flagę EX_TIMER_HIGH_RESOLUTION w parametrze Atrybuty . Gdy sterownik wywołuje procedurę ExSetTimer w celu ustawienia czasomierza o wysokiej rozdzielczości, system operacyjny zwiększa rozdzielczość zegara systemowego, w razie potrzeby, tak aby czas, w którym czasomierz wygasa bardziej dokładnie odpowiada nominalnym czasom wygaśnięcia określonym w parametrach DueTime i Period .
Sterownik Kernel-Mode Driver Framework (KMDF) może wywołać metodę WdfTimerCreate w celu utworzenia czasomierza o wysokiej rozdzielczości. W tym wywołaniu sterownik przekazuje wskaźnik do struktury WDF_TIMER_CONFIG jako parametru. Aby utworzyć czasomierz o wysokiej rozdzielczości, sterownik ustawia element członkowski UseHighResolutionTimer tej struktury na wartość TRUE. Ten element członkowski jest częścią struktury począwszy od systemów Windows 8.1 i KMDF w wersji 1.13.
Kontrolowanie dokładności czasomierza
Na przykład w przypadku systemu Windows działającego na procesorze x86 domyślny interwał między znacznikami zegara systemowego wynosi zwykle około 15 milisekund, a minimalny interwał między znacznikami zegara systemowego wynosi około 1 milisekund. W związku z tym czas wygaśnięcia czasomierza rozdzielczości domyślnej (który ExAllocateTimer tworzy, jeśli flaga EX_TIMER_HIGH_RESOLUTION nie jest ustawiona) może być kontrolowana tylko w ciągu około 15 milisekund, ale czas wygaśnięcia czasomierza o wysokiej rozdzielczości może być kontrolowany w ciągu milisekund.
Jeśli sterownik określa względny czas wygaśnięcia czasomierza rozdzielczości domyślnej, czasomierz może wygasnąć do około 15 milisekund wcześniej lub później niż określony czas wygaśnięcia. Jeśli sterownik określa względny czas wygaśnięcia czasomierza o wysokiej rozdzielczości, czasomierz może wygasnąć aż do milisekundy po upływie określonego czasu wygaśnięcia, ale nigdy nie wygasa wcześniej. Aby uzyskać więcej informacji na temat relacji między rozdzielczością zegara systemowego a dokładnością czasomierza, zobacz Dokładność czasomierza.
Jeśli nie ustawiono żadnych czasomierzy o wysokiej rozdzielczości, system operacyjny zazwyczaj uruchamia zegar systemowy z domyślną szybkością. Jeśli jednak ustawiono co najmniej jeden czasomierz o wysokiej rozdzielczości, system operacyjny może wymagać uruchomienia zegara systemowego z maksymalną szybkością przez co najmniej część czasu przed wygaśnięciem tych czasomierzy.
Aby uniknąć niepotrzebnego zwiększania zużycia energii, system operacyjny uruchamia zegar systemowy z maksymalną szybkością tylko wtedy, gdy jest to konieczne, aby spełnić wymagania dotyczące chronometrażu czasomierzy o wysokiej rozdzielczości. Jeśli na przykład czasomierz o wysokiej rozdzielczości jest okresowy, a jego okres obejmuje kilka domyślnych znaczników zegara systemowego, system operacyjny może uruchomić zegar systemowy z maksymalną szybkością tylko w części okresu czasomierza, który bezpośrednio poprzedza każde wygaśnięcie. W pozostałej części okresu czasomierza zegar systemowy działa z domyślną szybkością.
Aby zapobiec nadmiernemu zużyciu energii, sterowniki powinny unikać ustawiania okresu czasomierza o wysokiej rozdzielczości na wartość mniejszą niż domyślny interwał między znacznikami zegara systemowego. W przeciwnym razie system operacyjny jest zmuszony do ciągłego uruchamiania zegara systemowego z maksymalną szybkością.
Począwszy od systemu Windows 8, sterownik może wywołać procedurę ExQueryTimerResolution , aby uzyskać zakres rozdzielczości czasomierza obsługiwanych przez zegar systemowy.
Porównanie z exSetTimerResolution
Sterownik może wywołać procedurę ExSetTimerResolution , aby zmienić interwał czasu między kolejnymi przerwaniami zegara systemowego. Na przykład sterownik może wywołać tę procedurę, aby zmienić zegar systemowy z domyślnej szybkości na maksymalną szybkość, aby poprawić dokładność czasomierza. Jednak użycie funkcji ExSetTimerResolution ma kilka wad w porównaniu z używaniem czasomierzy o wysokiej rozdzielczości utworzonych przez exAllocateTimer.
Najpierw po wywołaniu funkcji ExSetTimerResolution w celu tymczasowego zwiększenia częstotliwości zegara systemowego sterownik musi wywołać funkcję ExSetTimerResolution po raz drugi, aby przywrócić zegar systemowy do domyślnej częstotliwości. W przeciwnym razie czasomierz zegara systemowego stale generuje przerwania z maksymalną szybkością, co może spowodować nadmierne zużycie energii.
Po drugie, sterownik korzystający z procedury ExSetTimerResolution nie może zoptymalizować tymczasowego użycia wyższych częstotliwości zegara systemowego tak skutecznie, jak system operacyjny działa w przypadku czasomierzy o wysokiej rozdzielczości. W związku z tym zegar systemowy poświęca więcej czasu na działanie z maksymalną szybkością niż jest to ściśle konieczne.
Po trzecie, jeśli wiele sterowników współbieżnie używa exSetTimerResolution w celu zwiększenia dokładności czasomierza, zegar systemowy może działać z maksymalną szybkością przez długi czas. Natomiast system operacyjny globalnie koordynuje działanie wielu czasomierzy o wysokiej rozdzielczości, tak aby zegar systemowy działał z maksymalną szybkością tylko wtedy, gdy jest to konieczne, aby spełnić wymagania dotyczące chronometrażu tych czasomierzy.
Na koniec użycie funkcji ExSetTimerResolution jest z natury mniej dokładne niż użycie czasomierza o wysokiej rozdzielczości. Po wywołaniu przez sterownik funkcji ExSetTimerResolution w celu zwiększenia zegara systemowego do maksymalnej szybkości, która zazwyczaj wynosi około jednego taktu na milisekundę, sterownik może wywołać procedurę, taką jak KeSetTimerEx, aby ustawić timer. Jeśli w tym wywołaniu sterownik określa względny czas wygaśnięcia, czasomierz może wygasnąć do około milisekund wcześniej niż lub później niż określony czas wygaśnięcia. Jeśli jednak czas wygaśnięcia względnego jest określony dla czasomierza o wysokiej rozdzielczości, czasomierz może wygasnąć do około milisekund później niż określony czas wygaśnięcia, ale nigdy nie wygasa wcześniej.