Kun opit lisää siitä, miten käyttöjärjestelmät ja niiden käyttämät laitteistot toimivat ja ovat vuorovaikutuksessa toistensa kanssa, saatat olla yllättynyt siitä, että näyttäisi olevan "resurssien" omituisuutta tai alikäyttöä. Miksi niin? Tämän päivän SuperUser Q & A -viestillä on vastaus utelias lukijan kysymykseen.
Tämän päivän Kysymys- ja vastausistunto tulee meille SuperUser-yhteisöstään, joka on Stack Exchangen osasto.
Kuva: Lemsipmatt (Flickr) .
Kysymys
SuperUser-lukija AdHominem haluaa tietää, miksi x86-suorittimet käyttävät vain kahta neljästä renkaasta:
Vain Linux- ja Windows-pohjaiset x86-järjestelmät käyttävät Rengas 0 ydintilaa varten ja Rengas 3 käyttäjätilaa varten. Miksi prosessorit erottavat jopa neljä erilaista rengasta, jos ne kaikki päätyvät käyttämään vain kahta niistä? Onko tämä muuttunut AMD64-arkkitehtuurin kanssa?
Miksi x86-suorittimet käyttävät vain kahta neljästä renkaasta?
Vastaus
SuperUser-avustaja Jamie Hanrahanilla on vastaus meille:
On kaksi ensisijaista syytä.
Ensimmäinen on se, että vaikka x86-keskusyksiköt tarjoavatkin neljä muistisuojausrengasta, sen tarjoama suojauksen tarkkuus on vain segmenttikohtaisella tasolla. Eli jokainen segmentti voidaan asettaa tietylle renkaalle (etuoikeustasolle) yhdessä muiden suojausten, kuten kirjoittamisen estävän, kanssa. Mutta segmenttikuvaajia ei ole niin paljon käytettävissä. Useimmat käyttöjärjestelmät haluaisivat paljon tarkemman muistisuojauksen, kuten… yksittäisille sivuille.
Joten kirjoita sivupöytäsuojaus. Suurin osa, ellei kaikki, nykyaikaiset x86-käyttöjärjestelmät jättävät enemmän tai vähemmän huomiotta segmentointimekanismin (niin paljon kuin pystyvät joka tapauksessa) ja luottavat sivutaulukkomerkintöjen matalan kertaluvun biteistä saatavaan suojaukseen. Yksi näistä on nimeltään "etuoikeutettu" bitti. Tämä bitti ohjaa sitä, onko prosessorin oltava jollakin "etuoikeutetulla" tasolla pääsyyn sivulle. "Etuoikeutetut" tasot ovat PL 0, 1 ja 2 . Mutta se on vain yksi bitti, joten sivukohtaisella suojaustasolla käytettävissä olevien "tilojen" määrä muistisuojauksessa on vain kaksi: Sivulle pääsee käsiksi ei-etuoikeutetusta tilasta. Siksi vain kaksi rengasta. Saadakseen neljä mahdollista rengasta kullekin sivulle, heillä on oltava kaksi suojabittiä jokaisessa sivutaulukon merkinnässä koodaamaan yksi neljästä mahdollisesta rengasnumerosta (aivan kuten segmenttikuvaajatkin). He eivät kuitenkaan tee niin.
Toinen syy on halu käyttöjärjestelmän siirrettävyyteen. Kyse ei ole vain x86: sta; Unix opetti meille, että käyttöjärjestelmä voi olla suhteellisen kannettava useille prosessoriarkkitehtuureille ja että se oli hyvä asia. Jotkut prosessorit tukevat vain kahta rengasta. Käyttöjärjestelmän toteuttajat tekivät käyttöjärjestelmistä kannettavamman, koska ne eivät riipu arkkitehtuurin useista renkaista.
On kolmaskin syy, joka liittyy Windows NT -kehitykseen. NT: n suunnittelijoilla (David Cutler ja hänen tiiminsä, jotka Microsoft palkkasi pois DEC Western Region Labsista) oli pitkä kokemus VMS: stä; Itse asiassa Cutler ja muutamat muut olivat VMS: n alkuperäisten suunnittelijoiden joukossa. Ja VAX-prosessorille, jolle VMS on suunniteltu, on neljä rengasta (VMS käyttää neljä rengasta).
Mutta VMS: ssä toimivat komponentit Renkaat 1 ja 2 (Record Management Services ja vastaavasti CLI) jätettiin NT-suunnittelun ulkopuolelle. Rengas 2 VMS: ssä ei oikeastaan ollut kyse käyttöjärjestelmän turvallisuudesta, vaan pikemminkin käyttäjän CLI-ympäristön säilyttämisestä ohjelmasta toiseen, eikä Windowsilla ollut tällaista käsitettä; CLI toimii tavallisena prosessina. Mitä tulee VMS: iin Rengas 1 , RMS-koodi Rengas 1 piti soittaa Rengas 0 melko usein, ja renkaan siirtymät ovat kalliita. Se osoittautui paljon tehokkaammaksi vain mennä Rengas 0 ja tehdä sen sen sijaan, että sinulla olisi paljon Rengas 0 siirtymät Rengas 1 koodi (taas ei, että NT: llä on joka tapauksessa jotain RMS: ää).
Miksi x86 otti käyttöön neljä rengasta, kun taas käyttöjärjestelmät eivät käyttäneet niitä, puhut paljon uudemmasta käyttöjärjestelmästä kuin x86. Suuri osa x86: n järjestelmäohjelmointiominaisuuksista suunniteltiin kauan ennen NT: n tai aitojen Unix-ish-ytimien käyttöönottoa, eivätkä tienneet, mitä käyttöjärjestelmä käyttää. Vasta kun saimme sivutuksen x86: lla, voimme toteuttaa todellisia Unix-ish- tai VMS-tyyppisiä ytimiä.
Paitsi että modernit x86-käyttöjärjestelmät jättävät suurelta osin huomiotta segmentoinnin (ne vain asettavat C-, D- ja S-segmentit, joiden perusosoite on 0 ja koko 4 Gt; F- ja G-segmenttejä käytetään joskus osoittamaan tärkeimpiin käyttöjärjestelmän tietorakenteisiin ), he jättävät myös suurelta osin huomiotta esimerkiksi "tehtävän tilasegmentit". TSS-mekanismi on suunniteltu selkeästi langankontekstikytkentää varten, mutta sillä on osoittautunut olevan liikaa sivuvaikutuksia, joten modernit x86-käyttöjärjestelmät tekevät sen "käsin". Ainoa kerta, kun x86 NT vaihtaa laitteistotehtäviä, on joissakin todella poikkeuksellisissa olosuhteissa, kuten kaksinkertaisen virheen poikkeus.
X64-arkkitehtuurin osalta monet näistä käyttämättömistä ominaisuuksista jätettiin pois. Kiitokseksi heidän ansioksien, että AMD puhui tosiasiassa käyttöjärjestelmän ydinryhmien kanssa ja kysyi, mitä he tarvitsivat x86: sta, mitä he eivät tarvinneet tai eivät halunneet ja mitä haluaisivat lisätä. X64: n segmentit ovat olemassa vain siinä muodossa, jota voidaan kutsua jäännösmuodoksi, tehtävän tilanvaihtoa ei ole jne., Ja käyttöjärjestelmät käyttävät edelleen vain kahta rengasta.
Onko sinulla jotain lisättävää selitykseen? Ääni pois kommenteista. Haluatko lukea lisää vastauksia muilta teknisesti taitavilta Stack Exchangen käyttäjiltä? Katso koko keskusteluketju täältä .