Dlaczego procesory x86 używają tylko dwóch z czterech pierścieni?
Gdy dowiesz się więcej o tym, w jaki sposób systemy operacyjne i sprzęt, z którego korzystają, pracują i wchodzą ze sobą w interakcje, możesz być zaskoczony tym, co wydaje się dziwactwem lub niepełnym wykorzystaniem "zasobów". Dlaczego? Dzisiejszy post z pytaniami i odpowiedziami dla SuperUser zawiera odpowiedź na ciekawe pytanie czytelnika.
Dzisiejsza sesja pytań i odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser - poddziału Stack Exchange, opartego na społecznościach grupowania witryn z pytaniami i odpowiedziami.
Zdjęcie dzięki uprzejmości Lemsipmatt (Flickr).
Pytanie
Czytnik SuperUser AdHominem chce wiedzieć, dlaczego procesory x86 używają tylko dwóch z czterech pierścieni:
Działają tylko systemy x86 oparte na systemie Linux i Windows Ring 0 dla trybu jądra i Pierścień 3 dla trybu użytkownika. Dlaczego procesorzy rozróżniają nawet cztery różne pierścienie, skoro wszyscy tak czy inaczej używają dwóch z nich? Zmieniło się to w architekturze AMD64?
Dlaczego procesory x86 używają tylko dwóch z czterech pierścieni?
Odpowiedź
Pomocnik SuperUser Jamie Hanrahan ma dla nas odpowiedź:
Istnieją dwa główne powody.
Po pierwsze, chociaż procesory x86 oferują cztery pierścienie ochrony pamięci, ziarnistość oferowanej przez nie ochrony jest tylko na poziomie segmentu. Oznacza to, że każdy segment może być ustawiony na konkretny pierścień (poziom przywilejów) wraz z innymi zabezpieczeniami, takimi jak blokada zapisu. Ale nie ma zbyt wielu dostępnych deskryptorów segmentów. Większość systemów operacyjnych chciałaby mieć znacznie dokładniejszą szczegółowość ochrony pamięci, np. ... dla poszczególnych stron.
Tak więc, wejdź w ochronę opartą na tabeli stron. Większość, o ile nie wszystkie, nowoczesne systemy operacyjne x86 mniej lub bardziej ignorują mechanizm segmentujący (tyle, ile mogą) i polegają na ochronie dostępnej z bitów niższego rzędu w pozycjach na tablicy stron. Jeden z nich nazywa się "uprzywilejowanym" bitem. Ten bit kontroluje, czy procesor musi znajdować się na jednym z poziomów "uprzywilejowanych", aby uzyskać dostęp do strony. Poziomy "uprzywilejowane" to PL 0, 1 i 2. Ale jest to tylko jeden bit, więc na poziomie ochrony "strona po stronie" liczba "trybów" dostępnych w zakresie ochrony pamięci to tylko dwa: Strona może być dostępna z trybu bez uprzywilejowania lub nie. Stąd tylko dwa pierścienie. Aby mieć cztery możliwe pierścienie dla każdej strony, musiałyby mieć dwa bity ochrony w każdym wpisie tablicy stron, aby zakodować jeden z czterech możliwych numerów dzwonków (podobnie jak deskryptory segmentów). Jednak nie robią tego.
Innym powodem jest chęć przenoszenia systemu operacyjnego. Nie chodzi tylko o x86; Unix nauczył nas, że system operacyjny może być względnie przenośny dla wielu architektur procesorów i że to była dobra rzecz. Niektóre procesory obsługują tylko dwa pierścienie. Nie zależnie od wielu pierścieni w architekturze, implementatorzy systemu operacyjnego sprawili, że systemy operacyjne są bardziej przenośne.
Jest trzeci powód, który jest specyficzny dla rozwoju Windows NT. Projektanci NT (David Cutler i jego zespół, którego Microsoft wynajął od DEC Western Region Labs) mieli duże doświadczenie w VMS; w rzeczywistości Cutler i kilku innych byli wśród oryginalnych projektantów VMS. Procesor VAX, dla którego zaprojektowano system VMS, ma cztery pierścienie (system VMS wykorzystuje cztery pierścienie).
Ale składniki, które działały w systemie VMS Pierścienie 1 i 2 (Record Management Services i CLI, odpowiednio) zostały pominięte w projekcie NT. Pierścień 2 w VMS w rzeczywistości nie chodziło o bezpieczeństwo systemu operacyjnego, ale raczej o zachowanie środowiska CLI użytkownika z jednego programu do drugiego, a Windows nie miał tej koncepcji; CLI działa jako zwykły proces. Jeśli chodzi o VMS Pierścień 1, kod RMS w Pierścień 1 musiał zadzwonić Ring 0 dość często, a przejścia między pierścieniami są drogie. Okazało się, że o wiele skuteczniej jest po prostu iść Ring 0 i trzeba z tym zrobić, a nie dużo Ring 0 przejścia w obrębie Pierścień 1 kod (znowu, nie to, że NT ma coś takiego jak RMS).
Jeśli chodzi o to, dlaczego x86 zaimplementował cztery pierścienie, podczas gdy systemy operacyjne ich nie używają, mówimy o systemach operacyjnych o znacznie nowszym wzornictwie niż x86. Wiele funkcji programowania systemu x86 zostało zaprojektowanych na długo przed zaimplementowaniem na nim NT lub prawdziwych jąder Uniksa i nie bardzo wiedziało, z czego będzie korzystać system operacyjny. Dopiero kiedy otrzymaliśmy stronicowanie na x86, możemy wprowadzić prawdziwe jądra typu Unix-ish lub VMS.
Współczesne systemy operacyjne x86 ignorują nie tylko segmentację (po prostu konfigurują segmenty C, D i S z adresem podstawowym 0 i rozmiarem 4 GB, segmenty F i G są czasami używane do wskazywania na kluczowe struktury danych systemu operacyjnego ), w dużej mierze ignorują też takie rzeczy jak "segmenty stanu zadań". Mechanizm TSS został wyraźnie zaprojektowany do przełączania kontekstu wątków, ale okazuje się, że ma on zbyt wiele efektów ubocznych, więc nowoczesne systemy operacyjne x86 robią to "ręcznie". Jedyny przypadek, w którym system x86 NT zmienia zadania sprzętowe, dotyczy niektórych naprawdę wyjątkowych warunków, takich jak wyjątek podwójnego błędu.
Jeśli chodzi o architekturę x64, wiele z tych nieużywanych funkcji zostało pominiętych. Według nich, AMD rozmawiało z zespołami jądra systemu operacyjnego i pytało, czego potrzebują od x86, czego nie potrzebują lub czego nie chcą, i co chcieliby dodać. Segmenty na x64 istnieją tylko w tak zwanej formie szczątkowej, przełączanie stanu zadania nie istnieje itd., A systemy operacyjne nadal używają tylko dwóch pierścieni.
Czy masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych użytkowników Stack Exchange, którzy znają się na technologii? Sprawdź cały wątek dyskusji tutaj.