Zakaj procesorji x86 uporabljajo samo dva od štirih »obročev«?
Ko se naučite več o tem, kako operacijski sistemi in strojna oprema delujejo in delujejo med seboj, boste morda presenečeni, ko vidite, kaj se zdi, da so nenavadne ali premalo izkoriščene »vire«, ki se pojavljajo. Zakaj? Današnja objava za vprašanja in odgovori SuperUser ima odgovor na vprašanje radovednega bralca.
Današnja seja vprašanj in odgovorov prihaja z namenom SuperUser-a, ki je del skupine Stack Exchange, ki temelji na skupnostih spletnih mest za vprašanja in odgovore.
Fotografija je odobrena s strani Lemsipmatt (Flickr).
Vprašanje
Bralnik SuperUser AdHominem želi vedeti, zakaj procesorji x86 uporabljajo le dva od štirih obročev:
Sisteme x86, ki temeljijo na Linuxu in Windows, uporabljajo samo Ring 0 za način jedra in Prstan 3 za uporabniški način. Zakaj procesorji celo razlikujejo štiri različne obroče, če se vse končajo z uporabo dveh od njih? Ali se je to spremenilo z arhitekturo AMD64?
Zakaj procesorji x86 uporabljajo le dva od štirih obročev?
Odgovor
Sodelavka SuperUser Jamie Hanrahan ima odgovor za nas:
Obstajata dva glavna razloga.
Prva je, da čeprav procesorji x86 ponujajo štiri obročke zaščite pomnilnika, je zrnatost ponujene zaščite le na ravni posameznega segmenta. To pomeni, da lahko vsak segment nastavite na poseben obroč (raven privilegijev) skupaj z drugimi zaščitami, kot so onemogočeni pisanje. Vendar ni na voljo veliko deskriptorjev segmentov. Večina operacijskih sistemov bi želela imeti precej drobnejšo zaščito pomnilnika, kot so… za posamezne strani.
Torej, vnesite zaščito na podlagi tabele strani. Večina, če ne vsi, sodobni operacijski sistemi x86 bolj ali manj ignorirajo mehanizem segmentiranja (kolikor je mogoče) in se zanašajo na zaščito, ki je na voljo v nizkih nizih vnosov v tabeli strani. Eden od njih se imenuje »privilegiran« bit. Ta bit nadzoruje, ali mora biti procesor v eni od »privilegiranih« ravni za dostop do strani. "Privilegirane" ravni so PL 0, 1 in 2. Ampak to je samo en bit, tako da je pri stopnji zaščite po straneh število "načinov", ki so na voljo, kar zadeva zaščito pomnilnika, samo dve: stran je lahko dostopna iz ne privilegiranega načina ali ne. Zato, samo dva zvonjenja. Če želite imeti za vsako stran štiri možne zvonove, bi morali imeti v vsaki vnosi v tabeli strani dva zaščitna bita za kodiranje ene od štirih možnih številk zvonjenja (prav tako kot deskriptorji segmentov). Vendar pa ne.
Drugi razlog je želja po prenosljivosti operacijskega sistema. Ne gre samo za x86; Unix nas je naučil, da je operacijski sistem lahko relativno prenosen na več procesorskih arhitektur in da je to dobra stvar. In nekateri procesorji podpirajo le dva zvonjenja. Izvajalci operacijskih sistemov, ki niso odvisni od večkratnih zvonjenj v arhitekturi, so operacijske sisteme naredili bolj prenosljive.
Obstaja tretji razlog, ki je specifičen za razvoj Windows NT. Oblikovalci NT-a (David Cutler in njegova ekipa, ki jih je Microsoft najel od DEC Western Region Labs) so imeli obsežne predhodne izkušnje z VMS; pravzaprav so bili Cutler in nekateri drugi med prvotnimi oblikovalci VMS. Procesor VAX, za katerega je bil zasnovan VMS, ima štiri obročke (VMS uporablja štiri obročke).
Toda komponente, ki so delovale v VMS Obroči 1 in 2 (Storitve upravljanja zapisov in CLI) sta bila izpuščena iz zasnove NT. Prstan 2 v VMS-u se dejansko ni ukvarjal z varnostjo operacijskega sistema, temveč z ohranjanjem uporabniškega okolja CLI iz enega programa v drugega, Windows pa tega koncepta ni imel; CLI deluje kot običajen postopek. Kot za VMS Prstan 1, kodo RMS v Prstan 1 moral poklicati Ring 0 precej pogosto in obročni prehodi so dragi. Izkazalo se je, da je veliko bolj učinkovito, da gremo Ring 0 in narediti z njo namesto veliko Ring 0 prehodov znotraj. \ t Prstan 1 koda (spet ni, da ima NT vseeno podobno RMS).
Glede na to, zakaj je x86 implementiral štiri obročke, medtem ko jih operacijski sistemi niso uporabljali, govorimo o operacijskih sistemih, ki so veliko novejši od x86. Veliko funkcij sistemskega programiranja x86 je bilo zasnovanih že pred uveljavitvijo NT ali resničnih jeder Unix-ish, in niso vedeli, kaj bi operacijski sistem uporabil. To ni bilo, dokler nismo dobili paging na x86, da bi lahko izvajali resnična Unix-ish ali VMS-podobna jedra.
Sodobni operacijski sistemi x86 v veliki meri ignorirajo segmentiranje (preprosto so nastavili segmente C, D in S z osnovnim naslovom 0 in velikostjo 4 GB; segmenti F in G se včasih uporabljata za usmerjanje na ključne podatkovne strukture operacijskega sistema. ), tudi v veliki meri ignorirajo stvari, kot so »segmenti nalogov«. Mehanizem TSS je bil jasno zasnovan za preklapljanje kontekstov niti, vendar se izkaže, da ima preveč stranskih učinkov, zato moderni x86 operacijski sistemi to storijo »ročno«. Edini čas, ko x86 NT spremeni strojne naloge, je za nekaj res izjemnih pogojev, kot je izjema z dvojno napako.
Kar zadeva arhitekturo x64, je bilo veliko teh opuščenih funkcij izpuščenih. AMD se je resnično pogovarjal z operacijskim sistemom jedrnih skupin in vprašal, kaj potrebujejo od x86, kaj ne potrebujejo ali niso želeli, in kaj bi želeli dodati. Segmenti na x64 obstajajo le v tem, kar bi lahko imenovali vestigialna oblika, preklapljanje stanja nalog ne obstaja itd., In operacijski sistemi še naprej uporabljajo samo dva zvonjenja.
Imate kaj dodati pojasnilu? Zvok v komentarjih. Želite prebrati več odgovorov drugih uporabnikov tehnologije Stack Exchange? Oglejte si celotno nit razprave tukaj.