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, społecznościowego forum z pytaniami i odpowiedziami.
Zdjęcie dzięki uprzejmości Lemsipmatt (Flickr).
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, jeśli w końcu wszyscy używają dwóch? Czy zmieniło się to w architekturze AMD64?
Dlaczego procesory x86 używają tylko dwóch z czterech pierścieni?
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 lepszą 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 tylko mogą) i polegają na ochronie dostępnej z bitów niższego rzędu we wpisach w tabeli stron. Jeden z nich nazywa się bitem "uprzywilejowanym". Ten bit kontroluje, czy procesor musi znajdować się na jednym z "uprzywilejowanych" poziomów dostępu 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, muszą one 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.
Drugim 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, operatorzy systemów operacyjnych 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 system Windows nie posiadał 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 (ponownie, nie, ż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 Uniksowych i nie bardzo wiedziało, z czego będzie korzystać system operacyjny. Dopiero po uruchomieniu stronicowania na x86 mogliśmy wdrożyć prawdziwe jądra typu Unix-ish lub VMS.
Nowoczesne systemy operacyjne x86 ignorują nie tylko segmentację (po prostu konfigurują 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 ), 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 wykonują je "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 tym, co można nazwać szczątkową formą, przełączanie stanu zadania nie istnieje itp., 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.