If-Koubou

Zašto x86 procesori koriste samo dva od četiri "prstena"?

Zašto x86 procesori koriste samo dva od četiri "prstena"? (Kako da)

Kada saznate više o tome kako operacijski sustavi i hardver koji rade na radu i interakciju jedni s drugima, možda ćete se iznenaditi kad vidite što se čini neobičnim ili nedovoljnim iskorištavanjem "izvora". Zašto je to? Danas SuperUser Q & A post ima odgovor na pitanje čudnog čitatelja.

Današnja pitanja i odgovori nam se javljaju zahvaljujući SuperUseru - podjele Stack Exchange-a, zajednice-driven grupiranja Q & A web stranica.

Fotografija ljubaznošću Lemsipmatt (Flickr).

Pitanje

Čitač SuperUser AdHominem želi znati zašto x86 CPU-ovi koriste samo dva od četiri prstena:

Koristite samo Linux i Windows x86 sustave Prsten 0 za kernel mod i Prsten 3 za korisnički način rada. Zašto procesori čak razlikuju četiri različita prstena, ako sve završi samo koristeći dvije od njih ionako? Je li to promijenjeno AMD64 arhitekturom?

Zašto x86 procesori koriste samo dva od četiri prstena?

Odgovor

Jamie Hanrahan odgovoran za SuperUser:

Postoje dva glavna razloga.

Prva je da, iako x86 CPU-ovi nude četiri prstena za zaštitu memorije, granularnost zaštite koja se nudi time je samo na razini segmenta. To jest, svaki segment može biti postavljen na određeni prsten (razina privilegija) zajedno s drugim zaštitama poput onemogućenog pisanja. No, ne postoje mnogi deskriptori segmenata. Većina operacijskih sustava želi imati mnogo finiju granularnost zaštite memorije, kao što su ... za pojedine stranice.

Stoga unesite zaštitu temeljenu na tablici. Većina, ako ne i svi, moderni x86 operativni sustavi više ili manje zanemaruju mehanizam segmentiranja (koliko god ionako mogu) i oslanjaju se na zaštitu koja je dostupna iz bitova s ​​niskim redoslijedom u stavkama tablice stranica. Jedan od njih naziva se "privilegiranim" bitom. Ovaj bit kontrolira hoće li procesor biti u jednoj od "povlaštenih" razina za pristup stranici. "Povlaštene" razine su PL 0, 1 i 2, No, to je samo jedan bit, stoga na razini zaštite po stranici, broj "načina rada" dostupnih za zaštitu memorije je samo dva: Stranica može biti dostupna iz neprivilegiranog načina ili ne. Dakle, samo dva prstena. Da bi imali četiri moguća prstena za svaku stranicu, trebali bi imati dva zaštitna bita u svakom unosu tablice stranice za kodiranje jednog od četiri moguća brojeva zvona (baš kao i deskriptori segmenata). Međutim, ne.

Drugi razlog je želja za prenosivost operativnog sustava. Nije samo o x86; Unix nas je naučio da operativni sustav može biti relativno prenosiv u više arhitektura procesora i da je to dobra stvar. A neki procesori podržavaju samo dva prstena. Neovisno o višestrukim zvonjenjima u arhitekturi, implementatori operativnog sustava učinili su operacijskim sustavima više prijenosni.

Postoji i treći razlog koji je specifičan za razvoj sustava Windows NT. Dizajneri NT-a (David Cutler i njegov tim, kojeg je Microsoft otkupio od DEC Western Regional Labs) imali su veliko iskustvo na VMS-u; u stvari, Cutler i neki od ostalih bili su među izvornim dizajnerima VMS-a. A VAX procesor za koji je dizajniran VMS ima četiri prstena (VMS koristi četiri prstena).

Ali komponente koje su se odvijale u VMS-ovima Prstenovi 1 i 2 (Službe za upravljanje zapisima i CLI) bile su izostavljene iz NT dizajna. Prsten 2 u VMS-u nije bilo zapravo o sigurnosti operativnog sustava, već o očuvanju CLI okruženja korisnika iz jednog programa u drugi, a Windows nije imao taj koncept; CLI radi kao obični proces. Što se tiče VMS-a Prsten 1, RMS kod u sustavu Prsten 1 morao se pozvati Prsten 0 prilično često, a prijelaz prstena je skup. Ispostavilo se da je daleko učinkovitije samo krenuti Prsten 0 i biti učinjeno s njom, a ne imati puno Prsten 0 prijelazi unutar Prsten 1 kod (opet, ne da NT ima nešto slično RMS bilo kako).

Kao i zašto x86 implementirao četiri zvona, a operacijski sustavi ih nisu koristili, govorite o operativnim sustavima daleko novijeg dizajna od x86. Mnogo značajki programiranja sustava x86 bile su dizajnirane davno prije nego što su na njemu implementirani NT ili pravi kerneli Unix-a, a zapravo nisu znali što će operativni sustav koristiti. Tek smo došli do weba na x86 da bismo mogli implementirati prave Unix-ove ili VMS-slične kernele.

Ne samo da moderni operacijski sustavi x86 uglavnom ignoriraju segmentiranje (oni samo postavljaju segmente C, D i S s baznom adresom od 0 i veličine 4 GB, a F i G segmenti ponekad se koriste za označavanje ključnih struktura podataka operativnog sustava ), oni u velikoj mjeri zanemaruju stvari poput "državnih segmenata zadataka". TSS mehanizam bio je jasno dizajniran za prebacivanje kontekstu konca, no ispada da ima previše nuspojava, tako da moderni operativni sustavi x86 to čine "ručno". Jedini put kad x86 NT mijenja hardverske zadatke je za neke doista izuzetne uvjete, kao što je iznimka dvostrukog kvara.

Što se tiče arhitekture x64, mnoge od tih iskorištenih značajki nisu bile na raspolaganju. Njihov kredit, AMD je zapravo razgovarao s kernel timovima operacijskog sustava i pitao što im je potrebno od x86, što nisu trebali ili nisu htjeli i što bi htjeli dodati. Segmenti na x64 postoje samo u onome što se može nazvati vestigialni oblik, prebacivanje zadataka ne postoji itd., A operacijski sustavi i dalje koriste samo dva prstena.

Imate li nešto za objašnjenje? Zvuči u komentarima. Želite li pročitati više odgovora od drugih tehnoloških korisnika Stack Exchangea? Pogledajte ovdje cijelu raspravu.