Dowiadując się więcej o tym, jak systemy operacyjne i sprzęt, na którym działają, działają i współdziałają ze sobą, 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 pytanie zaciekawionego czytelnika.
Dzisiejsza sesja pytań i odpowiedzi jest dostępna dzięki uprzejmości SuperUser - części Stack Exchange, grupy witryn internetowych 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:
Używają tylko systemów x86 opartych na Linux i Windows Pierścień 0 dla trybu jądra i Pierścień 3 dla trybu użytkownika. Dlaczego procesory rozróżniają nawet cztery różne pierścienie, skoro wszystkie i tak używają tylko dwóch z nich? Czy zmieniło się to w przypadku architektury AMD64?
Dlaczego procesory x86 używają tylko dwóch z czterech pierścieni?
Odpowiedź
Współautor SuperUser Jamie Hanrahan ma dla nas odpowiedź:
Są dwa główne powody.
Po pierwsze, chociaż procesory x86 oferują cztery pierścienie ochrony pamięci, stopień szczegółowości oferowanej przez nie ochrony jest tylko na poziomie segmentu. Oznacza to, że każdy segment można ustawić na określony pierścień (poziom uprawnień) 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 większą szczegółowość ochrony pamięci, na przykład… dla poszczególnych stron.
Dlatego wprowadź ochronę opartą na tabeli stron. Większość, jeśli nie wszystkie, współczesnych systemów operacyjnych x86 mniej lub bardziej ignoruje mechanizm segmentacji (na tyle, na ile mogą) i polega na ochronie dostępnej z najmniej znaczących bitów we wpisach tabeli stron. Jeden z nich nazywany jest bitem „uprzywilejowanym”. Ten bit określa, czy procesor musi znajdować się na jednym z „uprzywilejowanych” poziomów, aby uzyskać dostęp do strony. Poziomy „uprzywilejowane” to PL 0, 1 i 2 . Ale to tylko jeden bit, więc na poziomie ochrony strona po stronie liczba „trybów” dostępnych w zakresie ochrony pamięci wynosi tylko dwa: Strona może być dostępna z trybu nieuprzywilejowanego lub nie. Stąd tylko dwa dzwonki. Aby mieć cztery możliwe pierścienie dla każdej strony, musieliby mieć dwa bity ochrony w każdym wpisie tablicy stron, aby zakodować jeden z czterech możliwych numerów pierścieni (podobnie jak deskryptory segmentów). Jednak tak nie jest.
Drugim powodem jest chęć przenoszenia systemu operacyjnego. Nie chodzi tylko o x86; Unix nauczył nas, że system operacyjny może być stosunkowo przenośny na architekturę wielu procesorów i że to dobrze. Niektóre procesory obsługują tylko dwa pierścienie. Nie polegając na wielu pierścieniach w architekturze, osoby wdrażające systemy operacyjne uczyniły je bardziej przenośnymi.
Istnieje trzeci powód, który jest specyficzny dla rozwoju systemu Windows NT. Projektanci NT (David Cutler i jego zespół, których Microsoft zatrudnił poza firmą DEC Western Region Labs) mieli rozległe wcześniejsze doświadczenie z VMS; w rzeczywistości Cutler i kilku innych należało do oryginalnych projektantów VMS. A procesor VAX, dla którego zaprojektowano VMS, ma cztery pierścienie (VMS wykorzystuje cztery pierścienie).
Ale komponenty działające w VMS Pierścienie 1 i 2 (Odpowiednio Record Management Services i CLI) zostały pominięte w projekcie NT. Pierścień 2 w VMS tak naprawdę nie chodziło o bezpieczeństwo systemu operacyjnego, ale raczej o zachowanie środowiska CLI użytkownika od jednego programu do drugiego, a Windows nie miał takiej koncepcji; CLI działa jak zwykły proces. Jeśli chodzi o VMS Pierścień 1 , kod RMS w Pierścień 1 musiał zadzwonić Pierścień 0 dość często, a przejścia pierścieniowe są drogie. Okazało się, że bardziej efektywne jest po prostu pójście do Pierścień 0 i skończyć z tym, zamiast mieć dużo Pierścień 0 przejścia w ramach Pierścień 1 kod (znowu nie, że NT i tak ma coś podobnego do RMS).
Jeśli chodzi o to, dlaczego x86 zaimplementował cztery pierścienie, podczas gdy systemy operacyjne ich nie używały, mówisz o systemach operacyjnych o znacznie nowszym projekcie niż x86. Wiele funkcji programowania systemowego x86 zostało zaprojektowanych na długo przed zaimplementowaniem w nim jądra NT lub prawdziwego systemu Unix i tak naprawdę nie wiedzieli, czego będzie używał system operacyjny. Dopiero gdy otrzymaliśmy stronicowanie na x86, mogliśmy zaimplementować prawdziwe jądra uniksowe lub podobne do VMS.
Nie tylko nowoczesne systemy operacyjne x86 w dużej mierze ignorują segmentację (po prostu ustawiają segmenty C, D i S z adresem bazowym 0 i rozmiarem 4 GB; segmenty F i G są czasami używane do wskazywania kluczowych struktur danych systemu operacyjnego ), również w dużej mierze ignorują takie rzeczy, jak „segmenty stanu zadania”. Mechanizm TSS został wyraźnie zaprojektowany do przełączania kontekstów wątków, ale okazuje się, że ma zbyt wiele skutków ubocznych, więc nowoczesne systemy operacyjne x86 robią to „ręcznie”. Jedyny przypadek, w którym x86 NT zmienia zadania sprzętowe, dotyczy 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. Trzeba przyznać, że AMD faktycznie rozmawiało z zespołami zajmującymi się jądrem systemu operacyjnego i pytało, czego potrzebują od x86, czego nie potrzebują lub nie chcą, a co chcieliby dodać. Segmenty na x64 istnieją tylko w postaci, którą można nazwać szczątkową, przełączanie stanu zadań nie istnieje itp., A systemy operacyjne nadal używają tylko dwóch pierścieni.
Masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych zaawansowanych technicznie użytkowników Stack Exchange? Sprawdź cały wątek dyskusji tutaj .