Hjemmeside » hvordan » Hvorfor bruker x86-CPUer bare to av fire ringer?

    Hvorfor bruker x86-CPUer bare to av fire ringer?

    Når du lærer mer om hvordan operativsystemer og maskinvaren de kjører på jobb og samhandler med hverandre, kan du bli overrasket over å se hva som synes å være oddities eller underutnyttelse av "ressurser" som forekommer. Hvorfor det? Dagens SuperUser Q & A innlegg har svaret på en nysgjerrig leser spørsmål.

    Dagens Spørsmål & Svar-sesjon kommer til oss med høflighet av SuperUser-en underavdeling av Stack Exchange, en fellesskapsdrevet gruppering av Q & A-nettsteder.

    Foto med lov av Lemsipmatt (Flickr).

    Spørsmålet

    SuperUser-leser AdHominem vil vite hvorfor x86-CPUer bare bruker to av fire ringer:

    Linux og Windows-baserte x86-systemer bruker bare Ring 0 for kjernemodus og Ring 3 for brukermodus. Hvorfor skiller prosessorer selv fire forskjellige ringer hvis de alle ender opp med å bare bruke to av dem uansett? Har dette endret seg med AMD64-arkitekturen?

    Hvorfor bruker x86-CPUer bare to av fire ringer?

    Svaret

    SuperUser-bidragsyter Jamie Hanrahan har svaret for oss:

    Det er to primære årsaker.

    Den første er at selv om x86-CPUene tilbyr fire ringe med minnebeskyttelse, er beskyttelsesgraden av beskyttelse som tilbys derved kun på per-segmentnivå. Det vil si at hvert segment kan settes til en bestemt ring (privilegium) sammen med andre beskyttelser som skrive-deaktivert. Men det er ikke så mange segmentbeskrivelser tilgjengelig. De fleste operativsystemer vil gjerne ha en mye finere granularitet av minnebeskyttelse, som ... for enkelte sider.

    Så skriv inn sidebasert beskyttelse. De fleste, om ikke alle, moderne x86-operativsystemer, ignorerer mer eller mindre segmenteringsmekanismen (så mye som de kan uansett) og stole på beskyttelsen som er tilgjengelig fra lavordensbitene i sidetabelloppføringene. En av disse kalles den "privilegerte" biten. Denne bit kontrollerer hvorvidt prosessoren må være i et av de "privilegerte" nivåene for å få tilgang til siden. De "privilegerte" nivåene er PL 0, 1 og 2. Men det er bare en bit, så på sidebeskyttelsesnivået er antall "moduser" som er tilgjengelige med hensyn til minnesbeskyttelse, bare to: En side kan være tilgjengelig fra ikke-privilegert modus, eller ikke. Derfor bare to ringer. For å ha fire mulige ringer for hver side, måtte de ha to beskyttelsesbiter i hver sidebordoppføring for å kode et av fire mulige ringnumre (akkurat som segmentbeskrivelsene). Men de gjør det ikke.

    Den andre grunnen er et ønske om operativsystemportabilitet. Det handler ikke bare om x86; Unix lærte oss at et operativsystem kunne være relativt bærbart for flere prosessorarkitekturer, og at det var en god ting. Og noen prosessorer støtter bare to ringer. Ved ikke avhengig av flere ringer i arkitekturen, gjorde operativsystemimplementerne operativsystemene mer bærbare.

    Det er en tredje grunn som er spesifikk for Windows NT-utvikling. NTs designere (David Cutler og hans team, som Microsoft hyret fra DEC Western Region Labs) hadde omfattende tidligere erfaring på VMS; Faktisk var Cutler og noen av de andre blant VMS opprinnelige designere. Og VAX-prosessoren som VMS ble designet for, har fire ringer (VMS bruker fire ringer).

    Men komponentene som kjørte i VMS Ringer 1 og 2 (Record Management Services og CLI, henholdsvis) ble utelatt av NT-design. Ring 2 i VMS handlet ikke egentlig om operativsystemsikkerhet, men heller om å bevare brukerens CLI-miljø fra ett program til det neste, og Windows hadde ikke det konseptet; CLI går som en vanlig prosess. Som for VMS er Ring 1, RMS-koden i Ring 1 måtte ringe inn Ring 0 ganske ofte, og ringoverganger er dyre. Det viste seg å være langt mer effektivt å bare gå til Ring 0 og bli ferdig med det heller enn å ha mye Ring 0 overganger innenfor Ring 1 kode (igjen, ikke at NT har noe som RMS uansett).

    For hvorfor x86 implementerte fire ringer mens operativsystemene ikke brukte dem, snakker du om operativsystemer med langt nyere design enn x86. Mange av systemprogrammeringsfunksjonene til x86 ble designet lenge før NT eller ekte Unix-ish kjerner ble implementert på det, og de visste ikke helt hva operativsystemet skulle bruke. Det var ikke før vi fikk paging på x86 at vi kunne implementere ekte Unix-ish eller VMS-lignende kjerner.

    Ikke bare ignorerer moderne x86-operativsystemer i stor grad segmentering (de har bare satt opp C-, D- og S-segmentene med en baseadresse på 0 og størrelse på 4 GB; F- og G-segmenter brukes noen ganger til å peke på viktige operativsystemdatastrukturer ), ignorerer de i stor grad også ting som "oppgavestatsegmenter". TSS-mekanismen var klart utviklet for kontekstveksling av tråd, men det viser seg å ha for mange bivirkninger, slik at moderne x86-operativsystemer gjør det "for hånd". Den eneste gangen x86 NT endrer maskinvareoppgaver, er for noen virkelig eksepsjonelle forhold, som et dobbeltfeil unntak.

    Når det gjelder x64-arkitekturen, ble mange av disse ubrukte funksjonene utelatt. Til deres kreditt snakket AMD faktisk til operativsystemkjerneteam og spurte hva de trengte fra x86, hva de ikke trenger eller ikke vil ha, og hva de vil legge til. Segmenter på x64 eksisterer bare i det som kan kalles vestigial form, oppgavestatskontakt eksisterer ikke, etc., og operativsystemene fortsetter å bruke bare to ringer.


    Har du noe å legge til forklaringen? Lyder av i kommentarene. Vil du lese flere svar fra andre tech-savvy Stack Exchange-brukere? Sjekk ut hele diskusjonstråden her.