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:

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:

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

  1. 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ä"
  2. 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ä.
  3. Aina kun tapahtuu hyppy korkeammalta tasolta alemmalle tasolle, alemman tason pino alustetaan uudelleen.
  4. CS:ään ladattu RPL on aina yhtä suuri kuin CPL

Katso myös

Linkit