MSDOS, muistinhallinta

Käydään tässä läpi muutamia käytännössä havaittuja asioita ylämuistin hallinnasta (ja hiukan historiaa kans:) . Ohjelmien yleisohjeet kannattaa tarkistaa joko käsikirjoista tai DOS:n komennolla HELP.

Käytäntö
PC-koneissa näyttömuistin ja BIOS:n EPROM:n väliin sekä BIOS:n ja 1MB rajan väliin jää alueet, joita MSDOS ei osaa käyttää ilman erillisiä ajuriohjelmia. Nämä ohjelmat käynnistetään CONFIG.SYS:ssä seuraavasti (näiden rivien kuuluu olla tiedoston ensimmäisinä):

DEVICE=C:\DOS\HIMEM.SYS /TESTMEM:OFF
DEVICE=C:\DOS\EMM386.EXE NOEMS x=C800-CC00 i=CD00-EFFF HIGHSCAN
DOS=HIGH,UMB

Selityksiä:
/TESTMEM:OFF estää DOS:a tekemästä pitkää ja turhaa muistin tarkistusta. Tämä kuten BIOS:nkin tekemä muistin tarkistus vain tarkistaa, kuinka paljon koneessa mahdollisesti on muistia. Tämä tapahtuu siten, että kunkin kilotavun ensimmäiseen tavuun kirjoitetaan ja luetaan yleensä kaksi tavua: 0x55 ja 0xAA, joiden bittikuviot ovat sopivasti vastakkaiset. Tietyissä tapauksissa, erityisesti, mikäli muistiväylä on heikosti päätetty, tämä antaa epäluotettavan tuloksen.

RAM ja FRAMES -parametrit viittaavat sivutettuun muistiin. Nykyisin melkeimpä ainoastaan jotkut pelit ja Lotus 1-2-3 käyttävät sivutettua muistia. Näitä ohjelmia varten kannattaa koneeseen tehdä Multiboot -järjestely.

NOEMS ottaa koko ylämuistin käyttöön yhtenäisenä jatkuvana muistialueena.

x=c800-cc00 varaa muistista alueen c800:0000-cc00:0000lisäkortin mahdollisen RAM-muistin käyttöön. Tätä käytetään yliopistolla ISA-väylän verkkokorttien kanssa. Kotikoneessa tätä harvemmin tarvitaan, ellei lisäkortin ohjeissa toisin sanota.
Pitää myös tarkistaa tarvitseeko ISA-korttia varten varata tilaa BIOS-setupissa.

i=cd00-efff antaa tämän alueen DOS:n käyttöön.
Ilmeisesti Microfoftin ohjelmoijilla ei ole laskutaito paras mahdollinen, koska x- ja i- alueet täytyy asettaa juuri näin. Mikäli asetetaan x=c800-cc00 i=cc00-efff, DOS ilmoittaa virheestä. Mikäli asetetaan x=c800-cbff i=cc00-efff, tulee todelliseksi x-alueeksi c800:0000..cbff:0000, eli muistikortille varattu alue jääkin yläpäästään 256 B vajaaksi, jolloin esim verkkokortin toiminta on parhaimmillaankin epäluotettavaa !!!
Ylläolevalla tavalla menetetään 4 kB muistia, mutta saavutetaan koneen toimivuudessa huomattavaa etua.

DOS=HIGH ilmoittaa DOS:lle, että osan käyttöjärjestelmästä voi siirtää BIOS:n ja 1MB rajan väliselle alueelle 'jonka INTEL unohti'
DOS=UMB ilmoittaa DOS:lle, että ohjelmia saa sijoittaa myös alueelle A000-EFFF

Joissain koneissa voi EMM386.EXE -riville pistää myös parametrin i=B000-B7FF, jolloin DOS ottaa ohjelmien käyttöön myös tämän, alkujaan näyttömuistille varatun alueen. Kaikkien näyttökorttien kanssa tämä ei kuitenkaan toimi. Näytölle saattaa ilmestyä roskaa erityisesti graafisessa tilassa. Mahdollisesti Windowsin käynnistyminen ei onnistu.

 Joissakin vanhemmissa 386, 486 ja 586 -koneissa on esiintynyt outoa vikaa: mikäli koneessa käytetään MSDOS ver 6.xx, isot ohjelmat, esim WP51 (erityisesti esikatselussa ) ja Windows joko kaatuvat tai jumiutuvat satunnaisesti Tällöin sen kanssa pitää käyttää MSDOS ver 5.00:sta kopioitua emm386.exe -ohjainta. Itse olen kopioinut tämän ohjaimen nimelle C:\DOS5\5EMM386.EXEsekaannusten välttämiseksi. Ainoa tapa todeta tarvitaanko tätä korjausta, on testata CHECKIT-ohjelman (kaupallinen) muistitestillä muistin alin 64 kB. Jos kone jumiutuu tai boottaa, se tarvitaan.
Kuvatulla yhdistelmällä paranneltua konetta ei aina saa bootattua Ctrl-Alt-Del:lla (three finger salute, Vulcanian nerve pinch) Tälläisessä tapauksessa voi kokeilla emm386:n altboot-parametriä. (If your computer hangs when you press CTRL+ALT+DEL in step 2, change the device command to resemble the following: device=c:\dos\emm386.exe noems x=a000-efff altboot)

/HIGHSCAN-parametri ei toimi MSDOS ver 5.00:n emm386.exe:n kanssa vaan kone antaa virheilmoituksen.
Ylämuistissa saattaa olla konekohtaisia erikoisuuksia. BIOS saattaa normaalin F000-FFFF -muistialueensa lisäksi käyttää myös aluetta E000-EFFF. SCSI-kortit käyttävät usein aluetta C800-CC00. Tietyt lisäkortit, erityisesti kannettavien PCMCIA-väylässä, varaavat muistia alueelta D000-D400.
Joissakin koneissa heikosti päätetyt muistiväylät aiheuttavat ylämuistin virheellistä kayttäytymistä. Tämä näkyy TESTI.EXE ohjelmalla siten, että pyydettäessä useita kertoja peräkkäin kuvaa muistin käytöstä (F3) saadaan joka kerta erilainen kuvio. Tälläisessä koneessa on yleensä vaikeaa saada toimimaan verkkokortteja ja ylämuistiin latautuvia ohjelmia.
Joissakin vanhemmissa koneissa BIOS peilautui alueelta f000-ffff alueelle e000-efff, jolloin menetettiin 64 kB muistia.

Paras tapa nähdä mitä muistissa on, on ohjelma TESTI.EXE Tällä samalla ohjelmalla näkee myös, miten koneen I/O-avaruus on käytetty. Ohjelma on testattu ja toimii MSDOS ver 2.10.. ver 7.0, Win 3.0..Win98 sekä WinNT:ssä. Ainoastaan tietyt erikoisemmat näyttökortit aiheuttavat jumiutumisia I/O-testissä. Windows Y2K:ssa ohjelmaa ei ole vielä testattu. Samaan pyrkii myös Microsoftin MSD-ohjelma, jonka lähtökohta on kuitenkin eri (ja luotettavuus kyseenalainen).

Historiaa määritelmiä ja tulevaisuutta
8080 prosessorissa oli 16 osoitelinjaa, joten se kykeni osoittamaan 64 kB muistiavaruutta.
8088 kykeni osoittamaan 1 MB muistia
80286 kykeni osoittamaan jo (muistaakseni) 16 MB muistia, mutta ohjelmia jouduttiin edelleen ajamaan alimmassa 640 kB:ssä MSDOS:n rajoitusten takia. Ainoastaan jotkin apuohjelmat kykenivät käyttämään UMB-aluetta (Upper Memory Block).

Sivutettu (EXPANDED) muisti perustuu muistialueeseen, johon voidaan joko teknisin tai ohjelmallisin menetelmin vaihtaa toinen muisti'sivu'. Tätä varten varataan ylämuistista 64 kB alue, yleisimmin d000-dfff, joka jakautuu neljäksi 16 kB sivuksi (muistaakseni). Aluksi muistisivuille voitiin tallentaa ainoastaan dataa, mutta myöhemmissä versioissa myös ohjelmia. Mekanismi on tuttu jo PDP-11, CP/M+,  Memotech ja Commodore 64 -koneista.

Sivutettua muistia käytetään nykyisinkin esim näyttökorteilla, joiden pitää kyetä esittämään niille varatussa a000-bfff 128 kB muistialueessa esim 1024x768 kuva 32 värillä. Tähän tarvitaan 1024x768x4 B eli 3.072 MB. Jotkin näyttökortit tosin käyttävät tätä a000-bfff aluetta ainoastaan pieniresoluutioiselle kuvalle ja piirtävät suuriresoluutioisemmat extended-alueelle.

Laajennettu (EXTENDED) muisti tarkoittaa suoraviivaista, lineaarista muistiavaruutta, jossa muistipaikkojen osoitteet ovat yksikäsitteisiä kokonaislukuja.

Ylämuistin käytöstä haaveiltiin myös 8088-koneissa, joissa oli alkujaan vain 640 kB muistia ja joiden 8-bit väylä salli vain alimman 1 MB osoittamisen. Näissä asia ratkaistiin erillisillä lisäkorteilla, jotka enemmän tai vähemmän tapauskohtaisesti antoivat käyttöön sivutettua muistia.
286-koneiden yhteydessä asia tuli akuutiksi, ohjelmien kasvaessa yli käytössä olevan tilan. Syntyi LIM-EMS -määrittely (Lotus + Intel + Microsoft), jonka lopullinen, jäädytetty versio oli 4.0. Määrittelyssä sovittiin aluksi sivutetun muistin käytöstä mutta mukaan tuli myös laajennettu  muisti. 286-koneiden 16-bit ISA-väylä olisi sallinut suuremmankin yhtämittaisen  muistin käytön, mutta MSDOS ei ollut vielä valmis tähän.
286-prosessori käynnistettiin lisäksi MSDOS:a varten rajoitettuun 8088-yhteensopivaan toimintamoodiinsa, joka lukitsi 1MB rajan yläpuolisen muistialueen pois käytöstä. Se saatiin käyttöön antamalla näppäimistöohjaimen rekistereihin tietty koodi, joka aiheutti prosessorille keskeytyksen, jonka yhteydessä 286 asetettiin laajennettuun toimintatilaansa.
386 -prosessorien ja MSDOS ver 5.0 käyttöjärjestelmän mukana ylämuistin hallinta alkoi järkiperäistyä ollen MSDOS ver 6.xx ja 7.xx:ssä jo melkein järkevä. Alkuperäisessä MSDOS:ssa ei kuitenkaan ollut vielä valmiuksia jakaa ylämuistia ohjelmien kesken, joten vanhimmat ohjelmat saattavat aiheuttaa ongelmia ylämuistiin ladattuina. Pahimpia ovat TSR (Terminate but Stay Resident) -tyyppiset, taustalla toimivat ohjelmat. Tyypillisimpänä esimerkkinä MSDOS ver 2.xx mukana tulleet KEYBSU, KEYBSV, KEYBIT sekä Borlandin muuten mukava SideKick.

EMM386:lle on luonnollisesti olemassa kilpailevia tuotteita: QEMM386, 7EMM, PharLab. Nämä ovat normaalisti kohtuullisen korvaavia. Ainoastaan PharLab:n tuote on erikoisempi ratkaisu EXTENDED -muistin ohjain. Esim AutoCad:n vanhemmat versiot 2.5 ja 10 ja eräät pelit vaativat sen käyttöä kelpuuttamatta standardimpia EMM -ratkaisuja.
PharLab:n menetelma ei toimi luotettavasti Windowsin kanssa. Windows sisältää omat ylämuistimäärittelynsä, jotka eivät kaikin osin ole yhteensopivia MSDOS:n kanssa. (tämäkin saa epäilemään, ettei Microsoft ole itse kehittänyt yhtään markkinoimaansa ohjelmaa)

Tulevaisuudessa päässemme näistä muistimäärittelyistä kokonaan eroon. Win 95, 98, NT ja y2k -ohjelmissa muistin hallintaan on omat menetelmänsä.
PTMUSTA at UTU.FI