Miksi x86-keskusyksiköt käyttävät vain kahta neljästä renkaasta?
Kun opit lisää siitä, miten käyttöjärjestelmät ja laitteistot toimivat ja ovat vuorovaikutuksessa keskenään, saatat olla yllättynyt siitä, mikä näyttää olevan outoja tai "resurssien" alikäyttöä. Miksi niin? Tämän päivän SuperUser Q&A -postissa on vastaus utelias lukijan kysymykseen.
Nykypäivän Kysymys- ja vastaus -istunto tulee meille suotuisasti SuperUserin - Stack Exchange -alueen, yhteisöpohjaisen Q & A-sivustojen ryhmittymän - kautta..
Kuva: Lemsipmatt (Flickr).
Kysymys
SuperUser-lukija AdHominem haluaa tietää, miksi x86-keskusyksiköt käyttävät vain kahta neljää rengasta:
Vain Linux- ja Windows-pohjaiset x86-järjestelmät käyttävät Sormus 0 ytimen tilassa ja Sormus 3 käyttäjämoodille. Miksi prosessorit erottavat jopa neljä erilaista rengasta, jos ne kaikki lopulta käyttävät vain kahta niistä? Onko tämä muuttunut AMD64-arkkitehtuurilla?
Miksi x86-keskusyksiköt käyttävät vain kahta neljää rengasta?
Vastaus
SuperUserin avustaja Jamie Hanrahanilla on vastaus meille:
Syitä on kaksi.
Ensimmäinen on se, että vaikka x86-keskusyksiköt tarjoavat neljä muistin suojausrengasta, sen tarjoama suojaus on vain segmentin tasolla. Toisin sanoen jokainen segmentti voidaan asettaa tiettyyn kehykseen (etuoikeustaso) yhdessä muiden suojausten kanssa, kuten kirjoitus pois käytöstä. Monia segmentin kuvauksia ei kuitenkaan ole saatavilla. Useimmat käyttöjärjestelmät haluaisivat, että muistin suojaus olisi paljon hienompaa, kuten… yksittäisille sivuille.
Anna siis sivupöytään perustuva suojaus. Useimmat, elleivät kaikki, nykyaikaiset x86-käyttöjärjestelmät ohittavat enemmän tai vähemmän segmentointimekanismin (niin paljon kuin mahdollista) ja luottavat suojaukseen, joka on saatavana sivutaulukon merkinnöissä olevista matalista järjestyksistä. Yksi niistä on nimeltään "etuoikeutettu". Tämä bitti ohjaa, pitäisikö prosessorin olla yhdessä "etuoikeutetussa" tasossa päästäksesi sivulle. "Etuoikeutetut" tasot ovat PL 0, 1 ja 2. Mutta se on vain yksi bitti, joten sivun sivuilta suojaustasolla käytettävissä olevien tilojen määrä muistin suojauksen osalta on vain kaksi: Sivua voidaan käyttää ei-etuoikeutetusta tilasta tai ei. Näin ollen vain kaksi rengasta. Jotta kullakin sivulla olisi neljä mahdollista soittoääntä, niillä olisi oltava kaksi suojausbittiä kussakin sivutaulukossa, jotta ne koodaisivat yhden neljästä mahdollisesta rengasnumerosta (samoin kuin segmentin kuvaukset). He eivät kuitenkaan.
Toinen syy on käyttöjärjestelmän siirrettävyyden toive. Kyse ei ole vain x86: sta; Unix opetti meille, että käyttöjärjestelmä voisi olla suhteellisen kannettava useisiin prosessoriarkkitehtuureihin ja että se oli hyvä asia. Jotkut prosessorit tukevat vain kahta rengasta. Koska käyttöjärjestelmän toteuttajat eivät ole riippuvaisia useista renkaista arkkitehtuurissa, käyttöjärjestelmät ovat kannettavia.
Kolmas syy on Windows NT: n kehittämiseen. NT: n suunnittelijat (David Cutler ja hänen tiiminsä, jotka Microsoft palkkasi pois DEC Western Region Labsiltä) saivat laajaa aikaisempaa kokemusta VMS: stä; itse asiassa Cutler ja muutamat muut olivat VMS: n alkuperäisiä suunnittelijoita. VAX-prosessorilla, johon VMS on suunniteltu, on neljä rengasta (VMS käyttää neljää rengasta).
Mutta komponentit, jotka kulkivat VMS: ssä Sormukset 1 ja 2 (Record Management Services ja CLI) jätettiin pois NT-suunnittelusta. Sormus 2 VMS: ssä ei oikeastaan 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ätä käsitystä; CLI toimii tavallisena prosessina. Kuten VMS: t Sormus 1, RMS-koodi sisään Sormus 1 joutui soittaa Sormus 0 melko usein, ja renkaan siirtymät ovat kalliita. Se osoittautui paljon tehokkaammaksi vain mennä Sormus 0 ja tehdä sen kanssa sen sijaan, että sillä olisi paljon Sormus 0 siirtymiset Sormus 1 koodi (taas ei, että NT: llä on joka tapauksessa RMS: tä).
Miksi x86 toteutti neljä rengasta, kun käyttöjärjestelmät eivät käyttäneet niitä, puhut paljon uudemman suunnittelun mukaisista käyttöjärjestelmistä kuin x86. Paljon x86: n järjestelmäohjelmointiominaisuuksia suunniteltiin pitkään ennen kuin NT tai todelliset Unix-ish-ytimet otettiin käyttöön, eikä he todellakaan tiedä, mitä käyttöjärjestelmä käyttää. Vasta kun saimme sivun x86: lla, voisimme toteuttaa todellisia Unix-ish- tai VMS-tyyppisiä ytimiä.
Nykyaikaiset x86-käyttöjärjestelmät jättävät huomiotta segmentoinnin (ne asettavat vain C-, D- ja S-segmentit, joiden perusosoite on 0 ja koko 4 Gt; F- ja G-segmenttejä käytetään joskus osoittamaan keskeisiä käyttöjärjestelmän tietorakenteita ), ne myös jättävät suurelta osin huomiotta asioita, kuten ”tehtävän tilasegmentit”. TSS-mekanismi suunniteltiin selkeästi kierteen kontekstin vaihtoon, mutta sillä on liian monia sivuvaikutuksia, joten nykyaikaiset x86-käyttöjärjestelmät tekevät sen "käsin". Ainoa x86 NT: n muutos laitteistotehtävissä on joillekin todella poikkeuksellisille olosuhteille, kuten kaksoisvika-poikkeukselle.
X64-arkkitehtuurin osalta monet näistä käytöstä poistetuista ominaisuuksista jätettiin pois. Heidän luottoonsa AMD puhui tosiasiallisesti käyttöjärjestelmän ytimen ryhmiin ja kysyi, mitä he tarvitsivat x86: sta, mitä he eivät tarvinneet tai eivät halunneet ja mitä he haluaisivat lisätä. X64: n segmentit ovat olemassa vain, mikä voi olla nimeltään vestigiaalinen muoto, tehtävien vaihtaminen ei ole olemassa jne., Ja käyttöjärjestelmät käyttävät edelleen vain kahta rengasta.
Onko jotain lisättävää selitykseen? Ääni pois kommenteista. Haluatko lukea lisää vastauksia muilta tech-savvy Stack Exchange -käyttäjiltä? Tutustu koko keskusteluketjuun täällä.