Segmentoitu muistisuojaus
Segmentoitu muistisuojaus on yksi vaihtoehdoista muistin suojauksen toteuttamiseksi x86-prosessoreissa . Voidaan käyttää suojatussa tilassa Intel 80286 -prosessoreissa ja yhteensopivissa.
Kun käytetään litteää muistimallia ( englanniksi flat model , jota monet nykyaikaiset käyttöjärjestelmät käyttävät), jokainen segmentti kuvaa koko virtuaalimuistin määrän. Tällaisessa mallissa muistin suojaus toteutetaan lisäksi sivutulla muistilla . [yksi]
Määritelmät
Segmentin etuoikeustasoja (PL) on neljä (0-3). Etuoikeudet lisääntyvät luvun pienentyessä (eli nolla on etuoikeutetuin). Tasot 0-2 vastaavat valvojaa (Supervisor), 3 - käyttäjää (käyttäjää). Nollatasolla etuoikeutettujen ohjeiden käyttö on sallittua.
Segmentin käyttöoikeustaso (DPL English Descriptor Privilege Level ) vastaa segmenttikuvaajan DPL-kentän arvoa .
Nykyinen käyttöoikeustaso (CPL eng. Current Privilege Level ) vastaa sen koodisegmentin etuoikeustasoa, jonka valitsin on ladattu CS -rekisteriin (eli suorittavan koodisegmentin etuoikeustasoa).
Pyydetty etuoikeustaso (RPL eng. Requested Privilege Level ) on valitsimen kahdessa vähiten merkitsevässä bitissä (ohjelman asettama).
Suojauksen ehdot ja periaate
Kun valitsin ladataan segmenttirekisteriin ja kun muistia käytetään, segmentin suojausehdot tarkistetaan , ja jos ei, kutsutaan #GP-poikkeuskäsittelijä .
Suojausehdot ovat seuraavat:
- Et voi käyttää segmentin rajoja, jotka on merkitty rajalla [2] ;
- Segmenttirekistereihin ES, CS, SS, DS, FS, GS ei voi ladata järjestelmäsegmentteihin osoittavia valitsimia (joissa bitti S=0);
- Rekistereihin ES, DS, FS, GS on mahdollista ladata valitsimia sellaisille segmenteille, joille DPL>=Max(CPL, RPL);
- ES-, DS-, FS-, GS-rekistereihin voidaan ladata vain datasegmenttien tai koodisegmenttien valitsimia suorittamista/lukua varten;
- CS-rekisteriä ei voi ladata datasegmentin valitsimella;
- CS-rekisteri voidaan ladata vain koodisegmentin valitsimella, jos CPL=DPL;
- SS-rekisteri voidaan ladata vain luku/kirjoitusdatasegmentin valitsimella, jossa on DPL = CPL;
- Et voi kirjoittaa koodisegmenttiin;
- Et voi kirjoittaa vain luku -tietosegmentille;
- Järjestelmärekisterit LDTR , TR voidaan ladata vain segmenttivalitsimilla LDT ja vastaavasti TSS ;
Etuoikeustasojen vuorovaikutus
Neljän tason keskinäinen vuorovaikutus tapahtuu yhdyskäytävien avulla.
Yhdyskäytäväkuvaajassa , kuten segmentin kuvauksessa, on PL-kenttä. Yhdyskäytävän osoittamiseen sovelletaan yllä kuvattuja sääntöjä, mutta on olemassa lisäsääntöjä, jotka asettavat luonnollisia rajoituksia yhdyskäytävässä määritetylle koodi-/TSS-segmentille:
- Kutsutun segmentin DPL ei saa olla numeerisesti suurempi kuin CPL;
- Yhdyskäytävän DPL ei saa olla numeerisesti pienempi kuin siinä määritellyn segmentin DPL;
- Yhdyskäytävän tulee määrittää vain koodisegmentti tai TSS (jos se on tehtäväyhdyskäytävä);
Jos yhdyskäytävä käyttää muuta kuin alisteista segmenttiä samalla käyttöoikeustasolla, tai alempaan koodisegmenttiin, jolla on sama tai numeerisesti alempi käyttöoikeustaso, tapahtuu yksinkertainen siirtymä:
Push Flags ; Vain keskeytys- ja trap-porteille
Push CS
Push IP
Jmp FAR Gate_Address
Pinon vaihto
Jos tapahtuu siirtyminen alistamattomaan koodisegmenttiin, jolla on numeerisesti alempi käyttöoikeustaso, pino vaihdetaan , jotta vältetään sen ylivuoto ylemmillä (numeerisesti alemmilla) tasoilla. Esim. jos pinovirhe tapahtuu tasolla nolla, prosessori pysähtyy.
TSS-segmentti sisältää kolme etäpinon osoitetta - etuoikeustasoille 0 - 2.
Kun siirrytään korkeammalta tasolta alemmalle tasolle yhdyskäytävien kautta, oikeudet muuttuvat ja vastaavasti pinot vaihtuvat. [3]
Vaihtoalgoritmi näyttää hieman monimutkaisemmalta:
- Uudet SS-, (E)SP-arvot ladataan vastaavista TSS-kentistä;
- Aiemmat arvot SS, (E)SP (ennen kutsua) tallennetaan uuteen pinoon;
- Jos yhdyskäytävä on puheluyhdyskäytävä, niin kutsuvan ohjelman pinon WC-sanat/sanat kopioidaan uuteen pinoon;
- Jos se on keskeytys- tai trap-portti, (E)Flagsin arvo tallennetaan ;
- CS, (E)IP:n nykyinen arvo tallennetaan;
- Yhdyskäytäväkuvaajasta CS:(E)IP-rekistereihin ladataan uusi etäpään osoite, joka on määritetty kuvaajan asianmukaisissa kentissä;
Kun suoritat RetF / IRet -komentoa :
- Prosessori ponnahtaa kaukaisen paluuosoitteen (ja lippurekisterin) pinosta;
- Jos RetF-komennolla on parametri, se lisää (E)SP:tä arvollaan (poistaa proseduurille välitetyt parametrit pinosta);
- Jäsentää valitsimen CS:n RPL:n [4] : jos se on numeerisesti suurempi kuin CPL, ponnahtaa pinon edellisen yläosan etäosoitteen pinosta ja lataa sen SS:(E)SP:hen. Näin ollen tapahtuu paluu vanhaan pinoon;
Muistiinpanot
- ↑ The Unabridged Pentium 4 IA32 Processor Genealogy, Addison Wesley, 2004 ISBN 0-321-24656-X Luku 13. Litteä malli "On huomattava, että käytännössä kaikki nykyaikaiset käyttöjärjestelmät käyttävät litteää mallia.", "Ei ole mitään keinoa poista IA32-prosessorin segmentointilogiikka käytöstä. Kuitenkin, jos kaikki segmentit on kuvattu (GDT:ssä) luettavaksi/kirjoitettaviksi, alkaen sijainnista 00000000h ja pituudeltaan 4 Gt, segmentointi eliminoituu tehokkaasti." "Jos segmentointi poistetaan ja hakua käytetään, hakuyksikkö voi tarjota täydellisen suojan, ... seuraavat tarkistukset jokaisessa muistin käyttöyrityksessä"
- ↑ Segmenttejä on kahdenlaisia: kasvavat ja kasvavat alas . Sallittu segmenttiosoitealue ylöspäin kasvaville segmenteille : nollasta rajaan asti. Kasvu alaspäin : rajasta (mukaan lukien) $FFFFFF:iin G=0:ssa tai $FFFFFFFF:iin G=1:ssä.
- ↑ Aina kun tapahtuu hyppy korkeammalta tasolta alemmalle tasolle, alemman tason pino alustetaan uudelleen.
- ↑ CS:ään ladattu RPL on aina yhtä suuri kuin CPL
Katso myös
Linkit