När du lär dig mer om hur operativsystem och hårdvaran de kör på fungerar och interagerar med varandra, kan du bli förvånad över att se vad som verkar vara konstiga eller underutnyttjande av "resurser". Varför är det så? Dagens SuperUser Q & A-inlägg har svaret på en nyfiken läsares fråga.
Dagens Fråga & Svar-session kommer till oss med tillstånd av SuperUser - en underavdelning av Stack Exchange, en community-driven gruppering av Q & A-webbplatser.
Foto med tillstånd av Lemsipmatt (Flickr) .
Frågan
SuperUser-läsare AdHominem vill veta varför x86-processorer bara använder två av fyra ringar:
Linux- och Windows-baserade x86-system använder endast Ring 0 för kärnläge och Ring 3 för användarläge. Varför skiljer processorer till och med fyra olika ringar om de ändå bara använder två av dem? Har detta förändrats med AMD64-arkitekturen?
Varför använder x86-processorer bara två av fyra ringar?
Svaret
SuperUser-bidragsgivaren Jamie Hanrahan har svaret för oss:
Det finns två primära skäl.
Den första är att, även om x86-processorerna erbjuder fyra ringar av minnesskydd, är det detaljerade skyddet som erbjuds därmed bara på per segmentnivå. Det vill säga, varje segment kan ställas in på en specifik ring (privilegienivå) tillsammans med andra skydd som skrivfunktioner. Men det finns inte så många segmentbeskrivare tillgängliga. De flesta operativsystem skulle vilja ha en mycket finare detaljerad minneskydd, som ... för enskilda sidor.
Så ange sidtabellbaserat skydd. De flesta, om inte alla, moderna x86-operativsystem ignorerar mer eller mindre segmenteringsmekanismen (så mycket de ändå kan) och förlitar sig på det skydd som finns tillgängligt från lågordensbitarna i sidtabellposter. En av dessa kallas "privilegierad" bit. Denna bit kontrollerar om processorn måste vara på en av de "privilegierade" nivåerna för att komma åt sidan. De "privilegierade" nivåerna är PL 0, 1 och 2 . Men det är bara en bit, så på skyddsnivån sida för sida är antalet tillgängliga "lägen" vad gäller minneskydd bara två: En sida kan nås från icke-privilegierat läge eller inte. Därför bara två ringar. För att ha fyra möjliga ringsignaler för varje sida måste de ha två skyddsbitar i varje sidtabellpost för att koda en av fyra möjliga ringsiffror (precis som segmentbeskrivarna). Men det gör de inte.
Den andra anledningen är en önskan om operativsystems portabilitet. Det handlar inte bara om x86; Unix lärde oss att ett operativsystem kan vara relativt bärbart för flera processorarkitekturer, och att det var bra. Och vissa processorer stöder bara två ringar. Genom att inte bero på flera ringar i arkitekturen gjorde operativsystemsimplementörerna operativsystemen mer bärbara.
Det finns en tredje anledning som är specifik för Windows NT-utveckling. NT: s designers (David Cutler och hans team, som Microsoft anlitade från DEC Western Region Labs) hade omfattande tidigare erfarenhet av VMS; faktiskt så var Cutler och några av de andra bland VMS originaldesigners. Och VAX-processorn som VMS designades för har fyra ringar (VMS använder fyra ringar).
Men komponenterna som kördes i VMS Ringar 1 och 2 (Record Management Services respektive CLI) lämnades utanför NT-designen. Ring 2 i VMS handlade det inte riktigt om operativsystemsäkerhet, utan snarare om att bevara användarens CLI-miljö från ett program till ett annat, och Windows hade inte det konceptet; CLI körs som en vanlig process. När det gäller VMS Ring 1 , RMS-koden i Ring 1 var tvungen att ringa in Ring 0 ganska ofta, och ringövergångar är dyra. Det visade sig vara mycket effektivare att bara gå till Ring 0 och vara klar med det snarare än att ha mycket Ring 0 övergångar inom Ring 1 kod (återigen, inte att NT har något som RMS ändå).
När det gäller varför x86 implementerade fyra ringar medan operativsystem inte använde dem, talar du om operativsystem med mycket nyare design än x86. Många av systemprogrammeringsfunktionerna i x86 designades långt innan NT eller äkta Unix-ish-kärnor implementerades på den, och de visste inte riktigt vad operativsystemet skulle använda. Det var inte förrän vi fick sökning på x86 som vi kunde implementera äkta Unix-ish eller VMS-liknande kärnor.
Inte bara ignorerar moderna x86-operativsystem i hög grad segmentering (de ställer bara in C-, D- och S-segmenten med en basadress på 0 och storlek på 4 GB; F- och G-segment används ibland för att peka på viktiga operativsystemdatastrukturer ), ignorerar de till stor del saker som ”uppgiftsstatssegment”. TSS-mekanismen var tydligt utformad för trådkontextväxling, men det visar sig ha för många biverkningar, så moderna x86-operativsystem gör det "för hand". Den enda gången x86 NT byter maskinvaruuppgifter är för några riktigt exceptionella förhållanden, som ett dubbelfelundantag.
När det gäller x64-arkitektur utelämnades många av dessa nedlagda funktioner. Till deras kredit pratade AMD faktiskt med operativsystemets kärnteam och frågade vad de behövde från x86, vad de inte behövde eller inte ville och vad de skulle vilja lägga till. Segment på x64 finns bara i vad som kan kallas vestigial form, uppgiftsstatusväxling existerar inte etc., och operativsystem använder bara två ringar.
Har du något att lägga till förklaringen? Ljud av i kommentarerna. Vill du läsa fler svar från andra tekniskt kunniga Stack Exchange-användare? Kolla in hela diskussionstråden här .