Reell modus

Fra Wikipedia, den frie encyklopedi
Gå til: navigasjon, søk

Reell modus, også kalt reell adressemodus, er en adressemodus i 16 bit-prosessorene Intel 8086, Intel 8088, Intel 80186, Intel 80188 og deres kloner. Den er dessuten å finne i senere prosessorer bygget på x86-arkitekturen. Reell modus innebærer en 20 bit segmentert adressering av RAM med en øvre grense på 1024 kB, direkte tilgang til rutinene i BIOS og periferiutstyr, og manglende støtte for beskyttet modus og multitasking.

16-bit prosessoren Intel 80286 innførte beskyttet modus som prosessorens hovedmodus, men beholdt reell modus av kompatibilitetsgrunner. I denne modus kan operativsystemet utnytte maskinvaren for å kjøre flere programmer samtidig. Hvert program kjører i sitt eget reserverte minneområde, og er beskyttet mot å kollidere med minneområdet til andre programmer.

Ettersom x86-arkitekturen er konstruert for å være kompatibel med eldre programmer for Intel 8086 og Intel 80186, starter likevel 80286-prosessoren og dens etterfølgere fortsatt opp i reell modus. Operativsystemer som ønsker å benytte beskyttet modus eller lang modus må dermed inneholde en liten bit maskinkode skrevet for reell modus som gir prosessoren beskjed om å bytte modus.

Intel 80386 introduserte virtuell 8086 modus som gjør at programmer skrevet for kjøring av reell modus, kan kjøres under et operativsystem som ellers benytter beskyttet modus. Ettersom det er store forskjeller mellom måten reell modus og beskyttet modus forholder seg til minnet og periferiustyr, kreves det mye støtte fra operativsystemet for å få reell modus-programmer til å kjøre skikkelig.

Reell modus på PC[rediger | rediger kilde]

MS-DOS, PC-DOS, DR-DOS og beslektede operativsystemer, kjører i reell modus. De første versjonene av Microsoft Windows kjørte også i reell modus, og var grafiske brukergrensesnitt til MS-DOS. Windows/386 2.10 kjørte i beskyttet modus, og Windows 3.0 kunne kjøre i enten reell modus eller beskyttet modus. DOS-utvideren Windows 3.1x fjernet støtten for reell modus, og var det første operativsystemet med større utbredelse som krevde minimum en 80286 prosessor.

Adressering[rediger | rediger kilde]

Intel 8086, Intel 8088, Intel 80186 og Intel 80188 har 16 bit registre. Samtidig er adressebussen 20 bit. 20 bit adresser genereres ved å kombinere innholdet i to 16 bit registre. I reell modus genereres adresser ved å addere et segment med et offset. Et segment i reell modus er et sammenhengende stykke RAM på 64 kB. Segment 0 starter på fysisk minneadresse 0, segment 1 på fysisk minneadresse 16, og så videre opp til segment 65535.

Formelen for generering av adresser i 8086 er:

20 bit adresse = (16 x segment) + offset

8086-prosessoren har fire 16-bit segmentregistre, CS, DS, ES og SS. CS-registeret er kodesegment-registeret og brukes sammen med IP-registeret (programtelleren) som offset for å hente instruksjoner. SS-registeret adresserer stakken, mens DS- og ES-registrene adresserer andre data. Senere har det også blitt innført to nye registre, FS og GS, som benyttes på samme måte som DS og ES.

Eksempel:

CS-register = 1000H
IP-register = 0414H

20 bit adresse = (16 x 1000H) + 0414H
               = 10000H + 0414H
               = 10414H

Offset-verdien kan også angis med en hardkodet verdi eller ved resultatet av noen enkle beregninger som involverer spesifikke registre og tallverdier.

Enkelte instruksjoner benytter implisitt ett av segmentregistrene, slik som stakkinstruksjonene. Det finnes regler for hva man kan bruke for å angi offset til et gitt segment-register og hvilket segment-register som benyttes med et gitt offset-register, men disse reglene har blitt lempet på i nyere prosessorer og kan ofte overstyres.

Pekere[rediger | rediger kilde]

Som et resultat av måten minnet adresseres i reell modus, benytter programmer skrevet for denne modusen to typer pekere for å angi minnelokasjoner. På engelsk klassifiseres disse som near og far (nær og fjern). Førstnevnte inneholder bare en offset-verdi og henviser til en minnelokasjon internt i det segmentet som er gjeldende, altså noe som er i nærheten. Den andre typen angir både segment og offset, og kan vise til minnelokasjoner hvor som helst. For å behandle mer enn 64 kB data er programmer nødt til å bruke pekere som angir både segment og offset.

Når pekere skrives ned slik at mennesker kan lese dem benytter man formen segment:offset. Man benytter hovedsakelig sekstentallsystemet, noe som betyr at de to 16-biters verdiene får plass i fire siffer hver. Eksempel: A000:0000 (adressen til grafikkminnet på et VGA-kort).

Avbrudd- og unntakshåndtering[rediger | rediger kilde]

I reell modus finnes det en liste på opptil 256 pekere, normalt på adressen 0000:0000 som er standardverdien når prosessoren starter opp. Disse pekerne er på 4 byte og angir både segment og offset til en spesiell subrutine. De forskjellige avbruddene og unntakene er tilordnet en indeks til en peker i denne listen. Når prosessoren mottar et avbrudd eller et unntak oppstår vil den søke opp den tilhørende pekeren og utføre en spesiell type prosedyrekall til adressen angitt i denne pekeren. Subrutinen håndterer avbruddet eller unntaket og gir prosessoren beskjed om å returnere til det den holdt på med da den ble avbrutt.

Kun noen få registre lagres på stakken av prosessoren før den kaller opp avbruddsrutinen. Avbruddsrutinene må derfor selv sørge for å ikke ødelegge for programmet som kjørte da avbruddet kom ved å overskrive registre som programmet benytter. Normalt gjøres dette ved å lagre innholdet i registre avbruddsrutinene trenger på stakken, og så laste verdiene tilbake i registrene når avbruddsrutinen er ferdig.

Ettersom avbruddsrutinen i utgangspunktet benytter samme stakk som programmet som kjørte i forkant, kan den få problemer dersom programmet har fylt opp stakken eller benyttet stakkregistrene til noe annet.