Dlatego systemy x86 oparte na systemie Linux lub Windows używają tylko pierścienia 0 dla trybu jądra i pierścienia 3 dla trybu użytkownika. Dlaczego nawet procesory rozróżniają cztery różne pierścienie, jeśli i tak wykorzystują tylko dwa z nich? Czy zmieniło się to w architekturze AMD64?
cpu
operating-systems
privileges
AdHominem
źródło
źródło
Odpowiedzi:
Są dwa główne powody.
Pierwszy powód jest taki, że chociaż procesory x86 oferują cztery pierścienie ochrony pamięci, oferowana w ten sposób szczegółowość ochrony jest tylko na poziomie segmentu. Oznacza to, że każdy segment może być ustawiony na określony pierścień („poziom uprawnień”) od 0 do 3, wraz z innymi zabezpieczeniami, takimi jak wyłączenie zapisu. Ale dostępnych jest niewiele deskryptorów segmentów. Większość systemów operacyjnych chciałaby mieć znacznie lepszą szczegółowość ochrony pamięci. Jak ... dla poszczególnych stron.
Wprowadź ochronę na podstawie wpisów w tabeli stron (PTE). Większość, jeśli nie wszystkie współczesne systemy operacyjne x86, mniej lub bardziej ignorują mechanizm segmentacji (tak dalece, jak to tylko możliwe) i polegają na ochronie opartej na PTE. Jest to określone przez bity flagowe, które są dolnymi 12 bitami w każdym PTE - plus bit 63 w procesorach obsługujących brak wykonania. Na każdą stronę przypada jeden PTE, który zwykle ma 4K.
Jeden z tych bitów flagi nazywany jest bitem „uprzywilejowanym”. Ten bit kontroluje, 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ępny z trybu nieuprzywilejowanego lub nie. Stąd tylko dwa pierścienie.
Aby mieć cztery możliwe pierścienie dla każdej strony, musiałyby mieć dwa bity ochronne w każdym wpisie tablicy strony, aby zakodować jeden z czterech możliwych numerów dzwonków (podobnie jak deskryptory segmentów). Oni nie.
Drugi powód to cel przenośności systemu operacyjnego. Nie chodzi tylko o x86; Unix nauczył nas, że system operacyjny może być względnie przenośny dla architektur wieloprocesorowych, i to była dobra rzecz. Niektóre procesory obsługują tylko dwa pierścienie. Nie zależąc od wielu pierścieni w architekturze, realizatorzy systemów operacyjnych sprawili, że systemy operacyjne są bardziej przenośne.
Istnieje trzeci powód specyficzny dla rozwoju Windows NT. Projektanci NT (David Cutler i jego zespół, którego Microsoft zatrudnił z DEC Western Region Labs) mieli duże wcześniejsze doświadczenie w VMS; w rzeczywistości Cutler i kilku innych należało do oryginalnych projektantów VMS. A procesor VAX, dla którego zaprojektowano VMS (i odwrotnie) ma cztery pierścienie. VMS wykorzystuje cztery pierścienie. (W rzeczywistości VAX ma cztery bity ochronne w PTE, umożliwiając kombinacje takie jak „tylko do odczytu z trybu użytkownika, ale do zapisu z pierścienia 2 i wewnętrznego.” Ale dygresję.)
Ale komponenty, które działały w pierścieniach 1 i 2 VMS (Usługi zarządzania rekordami i CLI, odpowiednio) zostały pominięte w projekcie NT. Ring 2 w VMS tak naprawdę nie dotyczył bezpieczeństwa systemu operacyjnego, ale raczej ochrony środowiska CLI użytkownika od jednego programu do drugiego, a Windows NT po prostu nie miał tej koncepcji; CLI działa jako zwykły proces. Jeśli chodzi o pierścień 1 VMS, kod RMS w pierścieniu 1 musiał dość często dzwonić do pierścienia 0, a przejścia pierścienia są drogie. Okazało się, że o wiele bardziej wydajne było po prostu przejście do pierścienia 0 i zrobienie tego z nim, zamiast posiadania wielu przejść pierścienia 0 w kodzie pierścienia 1. (Ponownie - nie to, że NT i tak ma coś takiego jak RMS.)
Ale dlaczego oni tam są? 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 designie niż x86. Wiele funkcji „programowania systemowego” x86 zostało zaprojektowanych na długo przed wdrożeniem na nim jądra NT lub prawdziwego Uniksa, i tak naprawdę nie wiedzieli, czego będą używać systemy operacyjne. (Dopiero kiedy zaczęliśmy stronicować na x86 - który nie pojawił się aż do 80386 - mogliśmy zaimplementować prawdziwe jądra uniksowe lub VMS bez ponownego myślenia zarządzania pamięcią od podstaw.)
Nowoczesne systemy operacyjne x86 nie tylko ignorują 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), ale także w dużej mierze ignorują takie elementy, jak „segmenty stanu zadania”. Mechanizm TSS został wyraźnie zaprojektowany do przełączania kontekstu wątków, ale okazuje się, że ma zbyt wiele efektów ubocznych, więc współczesne systemy operacyjne x86 robią to „ręcznie”. Jedyny raz, na przykład, x86 NT zmienia zadania sprzętowe, na przykład w naprawdę wyjątkowych warunkach, takich jak wyjątek podwójnej usterki.
Do wersji x64 wiele z tych nieużywanych funkcji zostało pominiętych. (Na szczęście AMD rozmawiało z zespołami jądra systemu operacyjnego i pytało, czego potrzebują od x86, czego nie potrzebowali lub czego nie chcieli i co chcieliby dodać). Segmenty na x64 istnieją tylko w tym, co może być zwana formą szczątkową, przełączanie stanu zadań nie istnieje itp. Systemy operacyjne nadal używają tylko dwóch pierścieni.
źródło