Koduleht » kuidas » Miks kasutavad x86 CPU-d ainult neljast neljast rõngast?

    Miks kasutavad x86 CPU-d ainult neljast neljast rõngast?

    Lisateavet selle kohta, kuidas operatsioonisüsteemid ja riistvara töötavad ja suhtlevad üksteisega, võite olla üllatunud, kui näete, mis on nn. Miks nii? Tänase SuperUser Q&A postituse vastus on uudishimulik lugeja küsimus.

    Tänane küsimuste ja vastuste seanss saabub meiega kohtades, kus on SuperUser-Stack Exchange'i alajaotis, kogukondlikult juhitav Q&A veebisaitide rühmitus.

    Foto viisakalt Lemsipmattilt (Flickr).

    Küsimus

    SuperUser-lugeja AdHominem soovib teada, miks x86 CPU-d kasutavad ainult kahte neljast rõngast:

    Kasutatakse ainult Linuxi ja Windowsi põhiseid x86 süsteeme Ring 0 kerneli režiimi ja Ring 3 kasutajarežiimi jaoks. Miks töötlejad eristavad isegi nelja erinevat rõngast, kui nad kõik kasutavad vaid kahte neist? Kas see on muutunud AMD64 arhitektuuriga?

    Miks kasutavad x86 CPU-d ainult neljast rõngast kaks?

    Vastus

    SuperUser'i toetaja Jamie Hanrahanil on meile vastus:

    On kaks peamist põhjust.

    Esiteks on see, et kuigi x86 CPU-d pakuvad nelja mälukaitserõnga, on sellega pakutava kaitse granulaarsus ainult segmenditasandil. See tähendab, et iga segmendi saab seada konkreetsele ringile (privileegide tase) koos teiste kaitsetega, nagu kirjutuspuudega. Kuid selliseid segmendi kirjeldusi ei ole saadaval. Enamik operatsioonisüsteeme soovib, et mälukaitse oleks palju täpsem, näiteks üksikute lehtede puhul.

    Niisiis, sisestage lehe tabelipõhine kaitse. Enamik, kui mitte kõik, kaasaegsed x86 operatsioonisüsteemid ignoreerivad segmenteerimismehhanismi enam-vähem (nii palju kui võimalik) ja toetuvad kaitsele, mis on saadaval lehekülje tabeli kirjete madala järjekorra bittidest. Üks neist nimetatakse "privilegeeritud" bitiks. See bitt kontrollib, kas protsessor peab olema lehekülje avamiseks ühes „privilegeeritud” tasemest. "Eelisõiguslik" tase on PL 0, 1 ja 2. Kuid see on vaid üks bit, nii et lehe-leheküljelise kaitsetaseme korral on mälukaitse seisukohalt saadaval „režiimide” arv vaid kaks: Lehekülg võib olla ligipääsetav mitte privilegeeritud režiimist või mitte. Seega ainult kaks rõngast. Selleks, et iga lehekülje jaoks oleks neli võimalikku rõngast, peaks neil iga lehekülje tabeli kirje puhul olema kaks kaitseriba, et kodeerida ühte neljast võimalikust ringi numbrist (nagu ka segmendi deskriptorid). Kuid nad ei tee seda.

    Teine põhjus on operatsioonisüsteemi teisaldatavuse soov. See ei ole ainult x86; Unix õpetas meile, et operatsioonisüsteem võib olla suhteliselt kaasaskantav mitme protsessori arhitektuuri jaoks ja see oli hea. Mõned töötlejad toetavad ainult kahte rõngast. Kui mitte sõltuda arhitektuuri mitmest rõngast, muutsid operatsioonisüsteemi rakendused operatsioonisüsteemid kaasaskantavamaks.

    Kolmandal põhjusel on Windows NT arendamine spetsiifiline. NT disaineritel (David Cutler ja tema meeskond, kellele Microsoft palkas DEC Western Region Labsist eemal) oli laialdane varasem kogemus VMSis; tegelikult oli Cutler ja mõned teised VMSi algsest disainerist. Ja VAX-protsessoril, mille jaoks VMS on loodud, on neli rõngast (VMS kasutab nelja rõngast).

    Kuid komponendid, mis jooksid VMS-is Sõrmused 1 ja 2 (Record Management Services ja CLI) jäeti NT disainist välja. Ring 2 VMSis ei olnud tegelikult operatsioonisüsteemi turvalisus, vaid pigem kasutaja CLI keskkonna säilitamine ühest programmist teise ja Windowsil ei olnud seda kontseptsiooni; CLI töötab tavalise protsessina. VMSi puhul Ring 1, RMS-koodi sisse Ring 1 pidi helistama Ring 0 üsna sageli ja ringi üleminekud on kallid. See osutus palju tõhusamaks lihtsalt minna Ring 0 ja tehke seda pigem kui palju Ring 0 üleminekud Ring 1 kood (jällegi mitte, et NT-l on niikuinii midagi RMS-i).

    Mispärast x86 rakendas nelja rõngast, kui operatsioonisüsteemid neid ei kasutanud, siis räägite palju uuema disainiga operatsioonisüsteemidest kui x86. Paljud x86 süsteemi programmeerimisfunktsioonid kavandati pikka aega enne NT või tõeliste Unix-ish tuumade rakendamist ning nad ei teadnud, mida operatsioonisüsteem kasutaks. Alles siis, kui saime x86-ga otsingu, võime rakendada tõelisi Unix-ish või VMS-tüüpi tuumasid.

    Mitte ainult kaasaegsed x86 operatsioonisüsteemid ignoreerivad suuresti segmenteerimist (nad seadistavad C-, D- ja S-segmendid, mille baas aadress on 0 ja suurus 4 GB; F- ja G-segmente kasutatakse mõnikord, et osutada peamistele operatsioonisüsteemi andmestruktuuridele) ), ignoreerivad nad ka selliseid asju nagu „ülesande olekusegmendid”. TSS-mehhanism oli selgelt ette nähtud niitekontekstide vahetamiseks, kuid sellel on liiga palju kõrvaltoimeid, nii et kaasaegsed x86-operatsioonisüsteemid teevad seda „käsitsi”. Ainus kord, kui x86 NT muudab riistvaraülesandeid, on mõned tõeliselt erakordsed tingimused, nagu topeltvea erand.

    Mis puudutab x64 arhitektuuri, jäeti paljud neist kasutamata funktsioonidest välja. Oma krediidi jaoks rääkis AMD operatsioonisüsteemi kerneliikmetega ja küsis, mida nad vajavad x86-lt, mida nad ei vaja või ei tahtnud ja mida nad sooviksid lisada. X64-s olevad segmendid eksisteerivad ainult seda, mida võib nimetada vestigiaalseks vormiks, ülesande oleku vahetust ei eksisteeri jne ning operatsioonisüsteemid kasutavad jätkuvalt ainult kahte rõngast.


    Kas teil on midagi lisada selgitusele? Heli on kommentaarides välja lülitatud. Kas soovite lugeda rohkem vastuseid teistelt tech-savvy Stack Exchange'i kasutajatelt? Vaadake siin täielikku arutelu lõiku.