1. Reaalitilan muistinhallinta
2. Johdanto suojattuun tilaan
3. Suojatun tilan muistinhallinta
4. Keskeytykset ja poikkeukset

Katso myös:
1. Prashant TR:n laaja-alainen ja havainnollinen suojattua tilaa käsittelevä opas
2. Chris Giesen opas suojatusta tilasta

Reaalitilan muistinhallinta

Tekijä: Yariv Kaplan
Suomentanut Jouni Kähkönen 19.4.2005, 21.11.2005, 24.3.2007, 30.4.2007

Reaalitilan muistinhallinta

Intel-suorittimet alkavat käynnistyttyään suorittaa koodia reaalitilan toimintaympäristössä. Reaalitila on täysin yhteensopiva 8086-arkkitehtuurin kanssa, joten MS-DOS-sovelluksia voi ajaa uudemmilla suorittimilla eli esimerkiksi Pentiumilla ja Pentium Prolla. Reaalitilan lukuisten etujen myötä esiin nousee valitettavasti eräs haittapuoli; suorittimen ollessa reaalitilassa vain 20 alinta osoiteväylän bittiä ovat käytettävissä. Siksi 8086:n niukkaa yhden (1) megatavun muistiavaruutta voidaan käyttää vain rajoitetusti. IBM:n päätös varata PC-tietokoneen ylimmät 384 kilotavua ISA-laajennuskorteille (ja BIOS-järjestelmälle) vain pahensi asiaa, koska reaalitilan sovelluksille (esimerkiksi MS-DOS-järjestelmälle) jäi käytettäväksi vain vajaat 640 kilotavua RAM-muistia.

Suoritin tarvitsee vähintään 20 johdinta 1 megatavun muistin käyttämiseen. Suunnitellessaan 8086-suoritinta Intelin insinöörit totesivat 20-bittisten osoiterekisterien olevan osoitteiden käsittelemisessä epäkäytännöllisiä. Siten Intel päätti jakaa osoiteavaruuden 64 kilotavun segmentteihin ja koordinoida muistinkäytön kahden, 16-bittisen arvon eli segmentin ja siirroksen avulla.


Kaavio 1 - Reaalitilan muistinkäännösprosessi

Suorittimen luomien osoitteiden segmenttiosan tallentamista varten laadittiin neljä eri käyttötarkoituksiin soveltuvaa segmenttirekisteriä. Nämä rekisterit toimivat kantaosoitteena suorittimen fyysisessä osoiteavaruudessa sijaitsevalle varsinaiselle segmentille.

Segmenttirekisteri Käyttötarkoitus
CS
Koodisegmenttirekisteri (engl. code segment))
Tämä rekisteri osoittaa käytössä olevaan koodisegmenttiin. Käytetään yhdessä IP-rekisterin kanssa osoittamaan seuraavaan käskyyn, jonka suoritin hakee ja suorittaa.
DS
Datasegmenttirekisteri (engl. data segment)
Tämä rekisteri osoittaa yleensä oletusarvoiseen datasegmenttiin, joka sisältää käynnissä olevan sovelluksen globaalit ja staattiset muuttujat.
ES
Lisäsegmenttirekisteri (engl. extra segment)
Yleiskäyttöinen segmenttirekisteri, jota käytetään enimmäkseen datan siirtoon eri segmenttien välillä.
SS
Pinosegmenttirekisteri (engl. stack segment)
Tämä rekisteri osoittaa segmenttiin, joka sisältää aktiivisen pinon. Pinon yläkohta sijaitsee osoitteessa SS:SP.
FS
GS
Yleiskäyttöinen segmenttirekisteri
Esiteltiin alkujaan 80386:n yhteydessä. Näitä segmenttirekistereitä voi käyttää omassa sovelluskoodissa mihinkä tahansa tarkoitukseen.
Taulukko 1 - 80x86-suorittimien segmenttirekisterit

Segmenttirekisteriin asetettu arvo liittyy aina tiettyyn 64 kilotavun muistialueeseen, kun taas siirrososa osoittaa johonkin paikkaan tuon alueen sisällä. Fyysisen osoitteen laskemiseksi suoritin siirtää segmenttirekisterin arvoa neljä bittiä vasemmalle (eli kertoo sen arvon luvulla 16) ja lisää siihen siirroksen.


Kaavio 2 - Fyysisen osoitteen laskeminen reaalitilassa

Intelin käyttöönottama osoitteen esitysmuoto on reaalitilassa segmentti:siirros. Ajatellaan esimerkiksi osoitetta A359:B3FD. Se sijaitsee segmentissä A359h ja käyttää siirrosta B3FDh. Tämä esitysmuoto valittiin siksi, koska sillä voi määrittää fyysisen osoiteavaruuden sisältä tarkka sijainti sekä sen ansiosta ohjelmoija voi tarkastella osoitearvon sisäistä koostumusta.

Kiintoisaa on huomata, että vaikka segmentit ovat 64 kilotavun kokoisia, ne sijaitsevat muistissa 16 tavun päässä toisistaan. Ymmärrät asian, mikäli hoksaat, miten suoritin laskee fyysiset osoitteet reaalitilassa. Koska segmenttirekisterin arvon muodostaa fyysisen osoitteen 16 ylintä bittiä, arvo voidaan jakaa luvulla 16 neljän alimman bitin nollaamiseksi.

Tämä käsite kuvataan selkeästi seuraavassa kaaviossa:


Kaavio 3 - Peräkkäiset segmentit

Huomaa, että reaalitilassa segmenttien välituntumassa on pieni päällekkäinen alue, joten samaan fyysiseen osoitteeseen päästään useilla eri segmentti—siirros-yhdistelmillä. Jos esimerkiksi lataamme segmenttirekisterin arvolla 1234h ja käytämme siirroksena arvoa 5h, voimme lukea sisällön fyysisestä osoitteesta 12345h.

Mov BX, 1234h
Mov ES, BX
Mov BX, 5h
Mov AL, [ES:BX]

Tässä tapauksessa suoritin siirtää arvoa 1234h neljä bittiä vasemmalle (12340h) ja lisää arvoon siirroksen 5h. Voisimme vaihtoehtoisesti ladata ES-rekisterin arvolla 1233h ja käyttää siirrosta 15h saadaksemme täsmälleen samaa fyysistä osoitetta vastaavan muistin kohdan.

Tietokoneiden maailmaa hallitsi useiden vuosien ajan MS-DOS-järjestelmän reaalitila. Windows-käyttöjärjestelmän esiintulo toi mukanaan tietotekniikkateollisuuteen aivan uuden aikakauden, sillä reaalitilaa voitiin käyttää suojatun tilan alaisuudessa. Seuraavassa kappaleessa tutustumme suojatun tilan arkkitehtuuriin keskittyen lähinnä muistinhallinnan mutkikkaisiin seikkoihin.


Copyright © 1997, 1998 Yariv Kaplan
yariv(at)internals(dot)com
Suomennos: Jouni Kähkönen, käyttäjä=kajouni, palvelin=mbnet.fi

Avainsanat: suojattu tila protected mode 386 80386 x86 os operating system developing reaalitila käyttöjärjestelmäohjelmointi käyttöjärjestelmäohjelmoinnin ohjelmointi ohjelmoinnin operating system development memory management interrupts ints keskeytykset poikkeukset keskeytys poikkeus interrupts expections exceptions suoritin suorittimen suoritinta suorittimien suoritinten prosessori prosessorin prosessoria prosessoreiden sovellus sovelluksen sovellusta ohjelma ohjelman ohjelmaa application program hallinnansiirto ohjauksensiirto ohjauksen siirto control transfer