Linux żegna się ze starymi procesorami. TSC stał się obowiązkowy


Linux żegna się ze starymi procesorami. TSC stał się obowiązkowy

Linux wykonał ruch, na który użytkownicy bardzo starego sprzętu czekali od lat, choć dla części z nich może on oznaczać definitywny koniec pewnej epoki. W jądrze systemu usunięto ostatni mechanizm pozwalający budować wersję x86 bez obsługi licznika TSC. Od tej pory jego obecność może być traktowana jako rzecz oczywista w obsługiwanych procesorach.

Na pierwszy rzut oka wygląda to jak techniczny szczegół dotyczący kodu jądra. W praktyce jest to symboliczny moment dla Linuksa. System, który przez dziesięciolecia zachowywał kompatybilność ze sprzętem pamiętającym jeszcze czasy bardzo starych komputerów PC, może wreszcie pozbyć się kolejnej warstwy historycznego kodu.

Zmiana została wprowadzona pod nazwą „x86/cpu: Make CONFIG_X86_TSC unconditional”. Jej efekt jest prosty: opcja pozwalająca wyłączyć obsługę TSC przestaje być potrzebna, a samo wsparcie dla tego mechanizmu staje się stałym elementem konfiguracji jądra dla platformy x86.

TSC jest z Linuksem od bardzo dawna

TSC, czyli Time Stamp Counter, to 64-bitowy licznik znajdujący się w procesorze. Jego historia sięga czasów układów Intel Pentium. Mechanizm pozwala mierzyć upływ czasu z wysoką rozdzielczością, a odczyt licznika odbywa się bez korzystania z wolniejszych timerów znajdujących się poza samym rdzeniem procesora.

Do odczytywania TSC służą między innymi instrukcje RDTSC oraz RDTSCP. We współczesnych procesorach Intela i AMD licznik ten jest standardowym elementem architektury x86.

Jego znaczenie nie ogranicza się jednak do samego pomiaru czasu. Szybki dostęp do licznika ma znaczenie dla mechanizmów wymagających precyzyjnego odmierzania krótkich odcinków czasu, między innymi pomiarów wydajności czy obsługi zegara systemowego.

Alternatywą mogą być rozwiązania takie jak HPET, czyli High Precision Event Timer, oraz ACPI PM Timer. Ich wykorzystanie wiąże się jednak z większym kosztem dostępu niż w przypadku prostego odczytu rejestru procesora.

Linux przez lata pamiętał o procesorach sprzed epoki smartfonów

Powód, dla którego obsługa TSC nie zawsze mogła być uznawana za obowiązkową, tkwi w historii Linuksa. Jądro przez bardzo długi czas musiało radzić sobie z procesorami, które nie miały TSC albo nie zapewniały wystarczająco niezawodnego działania tego mechanizmu.

W efekcie w kodzie jądra pozostawały rozwiązania przygotowane z myślą o wyjątkowo starym sprzęcie. Linux potrafił wykrywać dostępność TSC, oceniać jego zachowanie, kalibrować licznik i w razie potrzeby korzystać z innych źródeł czasu.

Przez lata miało to sens. Linux był projektowany z myślą o niezwykle szerokim zakresie sprzętu, a możliwość uruchomienia systemu na komputerach, które dla dzisiejszego użytkownika są już niemal eksponatami muzealnymi, stanowiła jedną z charakterystycznych cech tego projektu.

Kolejne decyzje dotyczące architektury x86 stopniowo zmniejszały jednak znaczenie tej kompatybilności. Po usunięciu obsługi procesorów Intel 486 oraz kolejnych historycznych układów lista wspieranego sprzętu zaczęła wyglądać zupełnie inaczej niż jeszcze kilkanaście czy kilkadziesiąt lat temu.

Właśnie dlatego twórcy jądra mogą dziś usunąć kolejną warstwę kodu. Nie chodzi o dodanie wymagania, którego współczesne procesory nie potrafią spełnić. Chodzi o zakończenie utrzymywania wyjątków potrzebnych dla sprzętu, który dawno przestał należeć do głównego nurtu platformy x86.

Linux robi to później niż Windows

Ciekawym elementem całej historii jest porównanie z Windowsem. Microsoft zaczął wykorzystywać TSC jako preferowane źródło wysokorozdzielczego pomiaru czasu znacznie wcześniej, choć sposób obsługi tego mechanizmu w Windows różni się od rozwiązania zastosowanego w Linuksie.

W systemach Windows 2000 i Windows XP Microsoft wprowadził QueryPerformanceCounter, znany jako QPC, jako interfejs zapewniający pomiar czasu o wysokiej rozdzielczości. W przypadku starszych komputerów system mógł korzystać z innych timerów, jeżeli TSC był niewłaściwy, niespójny albo niezsynchronizowany pomiędzy procesorami.

Z czasem sytuacja zaczęła się zmieniać. Windows 7 oraz Windows Server 2008 R2 korzystały z niezmiennych liczników TSC jako podstawy QPC tam, gdzie możliwe było zapewnienie odpowiedniej synchronizacji. W Windows 8 i Windows 8.1 Microsoft poszedł jeszcze dalej, rozwijając mechanizmy synchronizacji przeznaczone również dla większych systemów.

Nie oznacza to jednak, że Windows całkowicie ignoruje alternatywy. Dokumentacja Microsoftu nadal opisuje mechanizmy sprawdzania właściwości TSC i możliwość wyboru innego sprzętowego źródła czasu, jeśli licznik procesora nie spełnia wymaganych warunków.

To ważna różnica. Microsoft udostępnia programistom QPC jako abstrakcję, zamiast zachęcać ich do bezpośredniego odczytywania TSC. System sam może dobrać odpowiedni mechanizm zależnie od sprzętu oraz środowiska, w którym działa.

Dlaczego szybki licznik procesora ma znaczenie

Różnica wydajności pomiędzy TSC a alternatywnymi timerami nie jest wyłącznie teoretyczna. Microsoft wskazuje, że odczyt QPC korzystającego z TSC może zajmować od dziesiątek do setek cykli procesora.

W przypadku użycia timerów znajdujących się poza procesorem koszt operacji może być znacznie większy. Microsoft podaje dla niektórych takich konfiguracji wartości sięgające około 0,8–1,0 mikrosekundy.

Przy pojedynczym pomiarze trudno uznać taką różnicę za istotną. Sytuacja wygląda inaczej w oprogramowaniu wykonującym bardzo wiele operacji pomiaru czasu. Wtedy nawet niewielki koszt pojedynczego odczytu może zacząć mieć znaczenie dla całego programu.

TSC ma jeszcze jedną zaletę. W odpowiednich konfiguracjach odczyt licznika może odbywać się bez kosztownego przejścia do jądra systemu. To jeden z powodów, dla których współczesne systemy operacyjne tak chętnie korzystają z możliwości oferowanych przez procesory.

Koniec starego kodu, a nie początek problemów

Najnowsza zmiana w Linuksie może więc wyglądać groźniej, niż jest w rzeczywistości. Użytkownik współczesnego komputera nie powinien odczuć jej jako nagłego ograniczenia funkcjonalności.

Nie pojawia się tutaj nowe wymaganie skierowane przeciwko typowym komputerom z procesorami Intel czy AMD. TSC jest obecne w nowoczesnych układach x86 od dawna. Z punktu widzenia aktualnego sprzętu decyzja twórców jądra jest przede wszystkim porządkowaniem kodu.

Najbardziej interesujący jest wymiar historyczny. Linux przez dziesięciolecia utrzymywał rozwiązania potrzebne do obsługi coraz mniej licznej grupy bardzo starych procesorów. Kolejne usuwane elementy pokazują, że granica kompatybilności systemu przesuwa się wraz z kolejnymi generacjami sprzętu.

Tym razem padło na TSC. Licznik obecny w procesorach od czasów Pentium przestaje być traktowany przez jądro jako opcjonalny element platformy x86. Dla współczesnego komputera nie jest to żadna rewolucja. Dla historii Linuksa to jednak kolejny wyraźny znak, że nawet najbardziej konserwatywne fragmenty jądra w końcu trafiają do archiwum.

Spodobało Ci się? Podziel się ze znajomymi!

Pokaż / Dodaj komentarze do:

Linux żegna się ze starymi procesorami. TSC stał się obowiązkowy
 0