Når du lærer mere om, hvordan operativsystemer og hardware, de kører på, fungerer og interagerer med hinanden, kan du blive overrasket over at se, hvad der synes at være underlige eller underudnyttelse af "ressourcer", der forekommer. Hvorfor det? Dagens SuperUser Q & A-indlæg har svaret på en nysgerrig læsers spørgsmål.
Dagens spørgsmål og svar-session kommer til os med tilladelse fra SuperUser - en underinddeling af Stack Exchange, en community-driven gruppe af Q&A websteder.
Foto med tilladelse til Lemsipmatt (Flickr) .
Spørgsmålet
SuperUser-læser AdHominem vil vide, hvorfor x86-CPU'er kun bruger to ud af fire ringe:
Linux- og Windows-baserede x86-systemer bruger kun Ring 0 til kernetilstand og Ring 3 til brugertilstand. Hvorfor adskiller processorer endda fire forskellige ringe, hvis de alle ender med at bruge to af dem alligevel? Er dette ændret med AMD64-arkitekturen?
Hvorfor bruger x86 CPU'er kun to ud af fire ringe?
Svaret
SuperUser-bidragyder Jamie Hanrahan har svaret til os:
Der er to primære årsager.
Den første er, at selvom x86-CPU'erne tilbyder fire ringe med hukommelsesbeskyttelse, er granulariteten af den beskyttelse, der tilbydes derved kun på niveauet pr. Segment. Det vil sige, at hvert segment kan indstilles til en bestemt ring (privilegieniveau) sammen med andre beskyttelser som skrivehæmmet. Men der er ikke så mange segmentbeskrivelser til rådighed. De fleste operativsystemer vil gerne have en meget finere detaljeret hukommelsesbeskyttelse, som ... for de enkelte sider.
Så indtast sidetabelbaseret beskyttelse. De fleste, hvis ikke alle, moderne x86-operativsystemer ignorerer mere eller mindre segmenteringsmekanismen (så meget som de alligevel kan) og stoler på den beskyttelse, der er tilgængelig fra bitene med lav ordre i sidetabelposter. En af disse kaldes "privilegeret" bit. Denne bit styrer, om processoren skal være på et af de "privilegerede" niveauer for at få adgang til siden. De "privilegerede" niveauer er PL 0, 1 og 2 . Men det er kun en smule, så på beskyttelsesniveau side-for-side er antallet af tilgængelige "tilstande", hvad hukommelsesbeskyttelse angår, kun to: En side kan være tilgængelig fra ikke-privilegeret tilstand eller ej. Derfor kun to ringe. For at have fire mulige ringe til hver side, skulle de have to beskyttelsesbits i hver sidetabelindgang for at kode en af fire mulige ringnumre (ligesom segmentbeskrivere). Men det gør de ikke.
Den anden årsag er et ønske om operativsystemportabilitet. Det handler ikke kun om x86; Unix lærte os, at et operativsystem kunne være relativt bærbart til flere processorarkitekturer, og at det var en god ting. Og nogle processorer understøtter kun to ringe. Ved ikke at være afhængig af flere ringe i arkitekturen gjorde operativsystemimplementerne operativsystemerne mere bærbare.
Der er en tredje grund, der er specifik for Windows NT-udvikling. NTs designere (David Cutler og hans team, som Microsoft hyrede væk fra DEC Western Region Labs) havde omfattende tidligere erfaring med VMS; faktisk var Cutler og nogle få af de andre blandt VMS originale designere. Og VAX-processoren, som VMS blev designet til, har fire ringe (VMS bruger fire ringe).
Men de komponenter, der kørte i VMS Ringe 1 og 2 (Henholdsvis Record Management Services og CLI) blev udeladt af NT-designet. Ring 2 i VMS handlede det ikke rigtig om operativsystemsikkerhed, men snarere om at bevare brugerens CLI-miljø fra det ene program til det næste, og Windows havde ikke dette koncept; CLI kører som en almindelig proces. Hvad angår VMS'er Ring 1 , RMS-koden i Ring 1 måtte ringe ind Ring 0 temmelig ofte, og ringovergange er dyre. Det viste sig at være langt mere effektivt at bare gå til Ring 0 og gøres med det i stedet for at have en masse Ring 0 overgange inden for Ring 1 kode (igen, ikke at NT alligevel har noget som RMS).
Med hensyn til hvorfor x86 implementerede fire ringe, mens operativsystemer ikke brugte dem, taler du om operativsystemer med langt nyere design end x86. Mange af systemprogrammeringsfunktionerne i x86 blev designet længe før NT eller ægte Unix-ish-kerner blev implementeret på den, og de vidste ikke rigtig, hvad operativsystemet ville bruge. Først da vi fik en personsøgning på x86, kunne vi implementere ægte Unix-ish eller VMS-lignende kerner.
Ikke kun ignorerer moderne x86-operativsystemer segmentering (de opsætter bare C-, D- og S-segmenterne med en basisadresse på 0 og størrelse på 4 GB; F- og G-segmenter bruges undertiden til at pege på centrale operativsystemdatastrukturer ), ignorerer de også stort set ting som “task state segmenter”. TSS-mekanismen var tydeligt designet til at skifte trådkontekst, men det viser sig at have for mange bivirkninger, så moderne x86-operativsystemer gør det "manuelt". Den eneste gang x86 NT skifter hardwareopgaver er for nogle virkelig usædvanlige forhold, som en dobbeltfejlundtagelse.
Med hensyn til x64-arkitektur blev mange af disse ubrugte funktioner udeladt. Til deres ære talte AMD faktisk med operativsystemets kerneteam og spurgte, hvad de havde brug for fra x86, hvad de ikke havde brug for eller ikke ønskede, og hvad de gerne ville tilføjet. Segmenter på x64 findes kun i hvad der kan kaldes vestigial form, skift af opgavetilstand findes ikke osv., Og operativsystemer bruger fortsat kun to ringe.
Har du noget at tilføje til forklaringen? Lyd fra i kommentarerne. Vil du læse flere svar fra andre teknisk kyndige Stack Exchange-brugere? Tjek den fulde diskussionstråd her .