Mycket av det som står i texten hör hemma ganska djupt inne i datorn men är ändå viktigt (eller åtminstone intressant) att känna till eftersom det bestämmer gränserna för PC-datorn som helhet.
Efter XT kom AT byggd kring 286-processorn, först 6MHz och sedan 8MHz. Kontakterna för utbyggnadskort förlängdes till 16 bitar. Det var först med AT som det blev riktigt vanligt att ha hårddisk. Några år senare kom IBM med sin PS/2-serie. PS/2 fanns med antingen 8088, 286 eller 386-processor och hade bla en mindre låda, 3.5"-diskettstation samt att de dyrare modellerna fick en helt ny typ av anslutning för utbyggnadskort, sk MicroChannel-bus.
Efterföljaren till 8088, Intels 286-processor, har hela 24 adresslinjer och kan därmed adressera 16MB. På 286 slår därför inte adressräkaren om till 0 när den passerar 1024kB, utan fortsätter vidare upp till 16MB. Program skrivna till 8088, inklusive DOS självt, skulle därför behöva skrivas om för att passa 286. Men Intel gjorde så att 286 kan köras i två olika lägen; Protected Mode där hela minnet är åtkomligt och Real Mode där 286 uppför sig nästan som en 8088.
Men bara nästan. Istället för att börja om på adress 0 när man passerar 1024kB så fortsätter adressräknaren hos 286 (och även 3/486) i Real Mode ända upp till 1088kB innan den slår om. Detta utrymme mellan 1024kB och 1088kB har kommit att kallas High Memory Area, HMA.
Pga detta fick IBM problem när de skulle kontstruera sin AT kring 286- processorn. AT måste ju tvunget kunna köra program skrivna till PC och XT. Därför la IBM till den sk A20-gaten, en elektronisk switch som vid uppstart av datorn öppnar sig och hindrar adresslinje nr 20 från att komma fram till minnet. Det gör att när processorn adresserar HMA- delen av minnet så når inte A20 fram utan det blir istället precis som på 8088.
A20-gaten kontrolleras via keyboard-controllern 8042. Vill man komma åt HMA-minnet så måste därför först keyboard-controllern anropas för att öppna A20-gaten.
(8042 är en liten dator i sig självt, med CPU, RAM och ROM, allt inbyggt i en 40-pinnars DIP-kapsel. 8042 kan programmeras under körning, t.ex för att bortse från Ctrl+Alt+Del.)
I och med att A20-gaten går att styra så kan HMA-minnet utnyttjas för datalagring, detta medan processorn fortfarande arbetar i Real Mode.
I DOS 5 är det drivrutinen HIMEM.SYS som används för att kontrollera åtkomsten till HMA-minnet. Anger man DOS=HIGH i CONFIG.SYS så är det DOS (och enbart DOS) som kommer att använda HMA-minnet för att där lägga vissa delar av sina systemfiler.
Men varje gång något i HMA-minnet ska användas så måste keyboard- controllern anropas för att öppna A20-gaten, och det kan bli väldigt ofta. Om man hela tiden bombarderar keyboardcontrollern med A20-växlingar så får den inte tid över att sköta sin egentliga uppgift, dvs tangentbordet. Det vanligaste symptomen är problem med Shift-tangenten eller att det verkar som man håller nere en tangent fastän man inte gör det.
De flesta tror att det går en skarp gräns vid 640kB, men detta är inte riktigt sant. DOS har ingen inbyggd gräns vid 640kB utan kan faktiskt använda så mycket oavbrutet minne som finns tillgängligt. Vid just minnesadressen 640kB (segmentadress A000h) så startar dock det minnesområde som är reserverat för bildskärmskort och andra tillbehör, och därför placeras normalt inget vanligt RAM-minne där.
Men alla bildskärmskort startar inte vid A000h. MDA-kortet (enbart monokrom text) startar inte förrän vid B000h och CGA-kortet (färg och begränsad grafik) börjar ända uppe vid B800h. Har man något av dessa kort och installerar minneskretsar från A000h och upp till dessa adresser så kommer DOS att kunna använda detta minne och man kan plötsligt ha kanske 700kB ledigt minne när man kollar detta med tex MEM. Normala DOS-program kommer att fungera utan problem. Kunde man dessutom flytta upp bildskärmskortet ännu en bit i minnet så skulle ännu mera utrymme bli ledigt osv. Det kan man nu inte göra eftersom väldigt många program snabbar upp sina skärmutskrifter genom att skriva direkt in i bildskärmskortets RAM-minne, som därför måste finnas på en bestämd plats.
Ett annat problem är att man på något sätt måste installera RAM- minneskapslar på dessa adresser. Det finns nästan inga extraminneskort som klarar av detta.
Man kan alltså inte direkt öka ut sina 640kB men där finns ju trots allt lediga luckor mellan 640kB och 1024kB som borde kunna användas.
Därför uppfann Lotus/Intel/Microsoft det så kallade LIM-EMS-minnet (Extended Memory Specification). Här låter man ett speciellt minneskontrollkort använda ett visst ledigt utrymme i området 640kB-1024kB (som ju processorn kan adressera i Real Mode) och låta detta område vara ett 'fönster' mot ett helt separat minne som ligger på EMS-kortet. EMS-minneskort var vanliga innan 386- datorerna hade slagit igenom och många program från den tiden kan använda EMS-minne, tex WordPerfect 5.1. Till varje fabrikat och modell av EMS-kort följer en drivrutin, kallad EMM.SYS, EMS.SYS eller liknande. Utan den drivrutinen kan kortet inte användas.
Minnet som ligger på adresser över 1MB och som kontrolleras av HIMEM.SYS kallas XMS-minne, efter regelverket för hur det ska anropas; eXtended Memory Specification. Det är alltså bara program som själva växlar till Protected Mode som kan använda sig av ev minne ovanför 1024kB+64kB. Till exempel Windows.
I en 286-processor så finns det ett kommando för att växla från Real till Protected Mode men inget kommando för att växla från Protected tillbaka till Real. Vitsen med Protected Mode är att processorn ska skydda mot felaktiga adresseringar och skulle man kunna växla till det oskyddade Real Mode så vore inte Protected Mode så skyddat längre. Så tyckte i alla fall Intel när man designade 286-processorn.
Men hur gör då program som ändå utnyttjar Protected Mode på en 286'a ? Jo, IBM har lagt in en nödlösning i självtesten som körs när datorn startas om. Om en viss databit är satt i det batteribackupade CMOS-minnet så körs inte självtesten, utan datorn kör igång direkt. Det man gör för att växla från Protected Mode till Real Mode på en 286'a är alltså att sätta den här databiten i SETUP-CMOS-minnet och sedan reset'ar hela processorn. Det är varken snyggt eller särskilt snabbt. I en 3- och 486-processor däremot så finns en instruktion för att växla från Protected till Real Mode.
VM8086-läget används främst av programmet EMM386.EXE som utnyttjar det på två sätt. Dels kan 'luckorna' i området 640kB-1024kB användas för att emulera EMS-minne utan att ett utomstående extraminneskort behövs. Dels kan 'luckorna' fyllas på med RAM-minne, då kommer dessa luckor att kallas UMB, Upper Memory Blocks. Om man anger DOS=UMB i CONFIG.SYS så använder DOS dessa UMB för att ladda drivrutiner genom 'DeviceHigh=' i CONFIG.SYS och 'LoadHigh' i AUTOEXEC.BAT.
Observera att när EMM386.EXE används så ställs alltid processorn i VM8086-Mode. Avancerade program som är skrivna innan 386'an var uppfunnen kommer att tro att de befinner sig i Real Mode. Försöker dessa program växla mellan (det de tror är) Real och Protected Mode så kommer datorn att hänga sig, ibland med ett felmeddelande från EMM386.EXE. Ett exempel är MatLab (DOS-versionen).
Om ett UMB läggs direkt efter 640k så kommer det minnet att höra till det vanliga 'Base'-memory, dvs effekten blir att man flyttar upp 640kB- gränsen en bit, man behöver alltså inte använda DOS=umb. Ex: EMM386.EXE med tillägget I=A000-AFFF. En annan lösning är QEMM386's VIDRAM som kan ta oanvänt minne på grafikkortet (EGA/VGA) och lägga ut det som vanligt RAM-minne.
I DOS 5 är användningen av UMB-blocken lite si och så, det går bara att använda för vissa drivrutiner. Dessutom utnyttjas alltid blocken i ordningsföljden: största blocket först och minsta sist, därför bör man ladda drivrutinerna i den ordningen, då är chansen störst att minnet kommer att utnyttjas optimalt. I DOS 6 kan programmet MEMMAKER hjälpa till med placeringen av drivrutiner. Andra tillverkare har gjort liknande och bättre lösningar som skapar och optimerar UMB-minne. Till exempel QEMM från Quarterdeck och 386MAX från Qualitas.
En 286'a kan på ett omständigt sätt växla mellan Real och Protected Mode för att på så sätt tillåta att DOS-program använder minne ovanför 1MB+64kB. 3/486 har däremot en instruktion för att växla från Protected till Real Mode och kan dessutom tack vare VM8086-läget köra Real Mode- program utan besvär.
HIMEM.SYS administrerar allt minne över 1MB och kallar det XMS-minne. EMM386.EXE kan tillhandahålla UMB och EMS i utrymmet 640-1024kB.
Om en ny DOS-version ska kunna utnyttja processorkraften bättre genom att köras i Protected Mode, och dessutom kunna köra alla de miljoner DOS-program som redan finns skrivna för Real Mode så är man helt enkelt tvungen att överge 8088, 8086 och 80286-processorerna. Microsoft kallar detta för Windows NT/95, IBM kallar det för OS/2.
Efterföljaren till VCPI heter DPMI (DOS Protected Mode Interface). DPMI definierar en uppsättning DOS- och BIOS-anrop som kan göras i Protected Mode varav vissa (Protected Mode minnesalokering) inte finns i Real Mode. Dessutom definieras metoder att anropa Real Mode device drivers. Windows stödjer DPMI.
Om ett program är så stort att det inte ryms i ett segment så måste en startrutin läggas till som delar upp programmet i delar om max 64kB och placerar dessa i olika segment samt ser till att de olika delarna anropar varandra på ett riktigt sätt. Ett program med en sådan startrutin har ändelsen .EXE och kan vara i princip hur stort som helst. Pga just startrutinen och den något omständigare minneshanteringen så är ett .EXE-program större och startar inte lika snabbt som ett .COM-program. Skilladen är visserligen marginell, men ändå.
I Protected mode finns basadress och längd i en indextabell någonstans i minnet. För att slippa att hela tiden läsa från den tabellen så sparas aktuella värden i sk 'descriptor caches'. Det finns en sådan cache för varje segmentregister i processorn. LOADALL laddar alla CPU-register och descriptor caches från en speciell tabell på absoluta RealMode- adressen 800h. Tabellformatet och anropet skiljer sig lite mellan 286 och 386. På 286 är op-coden 0Fh 05h, på 3/486 0Fh 07h. LOADALL finns inte med i Intel's manualer och stöds inte av MASM (assembler). LOADALL saknas på 486. Pga att 286 LOADALL används av så många program så emuleras den dock av alla 386 och 486 BIOS.
Den ännu hemligare metoden går ut på att det går att ändra begränsningen för hur stort ett segment får vara i Real Mode. Det ska vara 64kB men detta kan ändras, lämpligen till 4GB. Genom att sedan använda 32 bitars register för offset-adressen så har man access till hela minnet.
- DOS-versionen av WordPerfect är mer känslig än andra program, eftersom den själv programmerar om keyboard-controllern. Om man startar WordPerfect med parametern /nk så undviker man detta.
- Om man har AMI BIOS så kan det i SETUP-programmet finnas ett "FAST A20"-val. Det ska man i så fall aktivera. I botten av AMI's SETUP- skärm så står dessutom något som ser ut som ett serienummer följt av "-Kx", där x:et är keyboardcontrollerns versionsnummer. Det finns många olika t.ex -K8, 9, A, D och F. Vill man undvika problem ska man se till att ha minst version KF. Det är tyvärr inte säkert att en nyinköpt maskin alltid har en ny keyboardcontroller. Man kan naturligtvis även skruva isär datorn för att direkt på IC-kretsen kontrollera versionsnumret.
- Inte alla PC-datorer använder just keyboardcontrollern för att hantera A20-gaten. IBM PS/2 använder en helt annan teknik, liksom AT&T 6300+, Philips datorer, Acer 1100 och några fler. Därför har HIMEM.SYS en parameter för att ange maskintyp: HIMEM.SYS /m:n , där n är ett nummer från 1 till 15. Om du får problem med HIMEM, prova då igenom alla olika maskintyper (1-15), men se till att ha en boot-diskett inom räckhåll.
EMS = Expanded = Utbyggt
XMS = Extended = Utökat
Copyright Tomas Andersson 1996.