RSS

Rodzaje pamięci w MS-DOS

Liczba odsłon: 1124

Od pra­wie ćwierć wie­ku użyt­kow­ni­cy kom­pu­te­rów kla­sy PC pod po­ję­ciem „kon­fi­gu­rac­ja pa­mię­ci” ro­zu­mie­ją do­stra­ja­nie wy­daj­noś­ci mo­du­łów pa­mię­ci: zmia­ny częs­to­tli­woś­ci tak­to­wa­nia lub mo­dy­fi­ko­wa­nie pa­ra­met­rów cza­so­wych. Wcześniej ten ter­min zna­czył jed­nak coś zu­peł­nie in­ne­go. Użytkow­ni­cy sys­te­mu MS-DOS mu­sie­li wie­dzieć, czym róż­nią się ob­sza­ry pa­mię­ci pod­sta­wo­wej, ex­ten­dedex­pan­ded oraz co ozna­cza­ją skró­ty ta­kie jak EMS, HMA czy UMB. Od umie­jęt­ne­go wy­zna­cza­nia po­dzia­łów mię­dzy blo­ka­mi pa­mię­ci o róż­nym cha­rak­te­rze i moż­li­wo­ściach wy­ko­rzys­ta­nia za­le­ża­ła nie tyl­ko szyb­kość dzia­ła­nia pro­gra­mów, ale cza­sem i to, czy te pro­gra­my moż­na by­ło w ogó­le uru­cho­mić.

W po­niż­szym ar­ty­ku­le przy­po­mi­nam te za­gad­nie­nia, po­ka­zu­jąc Wam, jak wie­le mo­zol­nej, tech­nicz­nej pra­cy wy­ma­ga­ją­cej szcze­gó­ło­wej zna­jo­moś­ci za­sad dzia­ła­nia kom­pu­te­ra oszczę­dza­ją nam dzi­siej­sze sys­te­my opera­cyj­ne pra­cu­ją­ce w try­bie nad­zo­ro­wa­nym.

Na po­cząt­ku 640 ki­lo­baj­tów mia­ło wy­star­czyć każ­de­mu. Tak przy­naj­mniej gło­si fa­ma: sam Bill Gates twier­dzi, że nig­dy nie wy­po­wie­dział tych słów. Niezależnie od te­go, układ Intel 8086, ze swo­ją me­ga­baj­to­wą prze­strze­nią adre­so­wą, w mo­men­cie pre­mie­ry nie na­kła­dał na pro­gra­mis­tów zbyt du­żych ogra­ni­czeń. Szesnaście seg­men­tów po 64 KiB każ­dy – do­kład­nie szes­naś­cie ra­zy wię­cej, niż ofe­ro­wa­ły mi­kro­pro­ce­so­ry 8-bi­to­we – po­zwa­la­ło zmieś­cić cał­kiem po­kaź­ny pro­gram wraz z wy­ma­ga­ny­mi da­ny­mi. Twórcom opro­gra­mo­wa­nia dla kom­pu­te­rów IBM PC po­zo­sta­wio­no co praw­da tyl­ko dzie­więć ta­kich blo­ków, ale i ta­ką ilość pa­mię­ci trud­no by­ło za­peł­nić w spo­sób po­ży­tecz­ny. Nic dziw­ne­go, że pierw­sze kom­pu­te­ry PC mia­ły 64 KiB pa­mię­ci, a na­wet póź­niej ty­po­wą po­jem­noś­cią by­ło tyl­ko 256 czy 512 KiB: więk­sza jej ilość zwięk­sza­ła koszt, nie da­jąc użyt­kow­ni­ko­wi wie­le w za­mian.

Kompute­ry IBM PC jed­nak w nie­sa­mo­wi­tym, nie­prze­wi­dzia­nym przez ni­ko­go tem­pie zdo­by­wa­ły po­pu­lar­ność i roz­przes­trze­nia­ły się po świe­cie. Coraz szer­sze rze­sze pro­gra­mis­tów two­rzy­ły co­raz bar­dziej skom­pli­ko­wa­ne pro­gra­my. Kolejne wer­sje sys­te­mu opera­cyj­ne­go MS-DOS zaj­mo­wa­ły ko­lej­ne ki­lo­baj­ty kur­czą­cej się prze­strze­ni adre­so­wej pro­ce­so­ra a pros­te, jed­no­seg­men­to­we pro­gra­my ty­pu COM zo­sta­ły za­stą­pio­ne skom­pli­ko­wa­ny­mi, wie­lo­seg­men­to­wy­mi EXE. Pojawił się me­cha­nizm na­kła­dek ma­ją­cy, kosz­tem wy­dłu­żo­ne­go ocze­ki­wa­nia na wy­wo­ła­nie funk­cji pro­gra­mu, po­zo­sta­wić użyt­kow­ni­ko­wi jak naj­więk­szy ob­szar pa­mię­ci na je­go do­ku­men­ty, bez ko­niecz­noś­ci re­zyg­na­cji z funkcjo­nal­noś­ci pro­gra­mu, pros­to­ty ob­słu­gi, ele­gan­cji inter­fej­su czy bo­ga­tej do­ku­men­ta­cji elek­tro­nicz­nej. Wreszcie, gdy po­ja­wi­ły się pro­gra­my re­zy­dent­ne, zaj­mu­ją­ce pa­mięć przez ca­ły czas pra­cy kom­pu­te­ra, a racz­ku­ją­ce śro­do­wis­ko Micro­soft Win­dows po­ka­za­ło użyt­kow­ni­kom, że moż­li­wa jest jed­no­czes­na pra­ca z wie­lo­ma pro­gra­ma­mi dzia­ła­ją­cy­mi we włas­nych ok­nach, oczy­wis­te sta­ło się, że archi­tek­tu­ra PC po­trze­bu­je wię­cej pa­mię­ci.

8086, 8088

Pamięć EMS

Proceso­ry 8086 i 8088, w któ­re by­ły wy­po­sa­żo­ne kom­pu­te­ry IBM PCPC/XT, dys­po­no­wa­ły 20-bi­to­wą ma­gis­tra­lą adre­so­wą. Cała fi­zycz­na prze­strzeń adre­so­wa by­ła wy­ko­rzy­sta­na: 640 KiB na pa­mięć RAM, 320 KiB na do­dat­ko­we ob­sza­ry pa­mię­ci kart roz­sze­rza­ją­cych (w tym bu­for ram­ki) i 64 KiB na pa­mięć ROM. Karta roz­sze­rze­nia pa­mię­ci mog­ła­by wy­ko­rzys­tać okno o roz­mia­rze 64 lub 128 KiB; trud­no mó­wić o przy­dat­noś­ci ta­kie­go roz­sze­rze­nia, a ogra­ni­cze­nie do­stęp­nej prze­strze­ni adre­so­wej, szcze­gól­nie w przy­pad­ku ok­na 128 KiB, by­ło­by znacz­ne.

Podział fi­zycz­nej prze­strze­ni adre­so­wej pro­ce­so­rów 8086 i 8088 w kom­pu­te­rach IBM PC i zgod­nych (mi­ni­mal­na kon­fi­gu­rac­ja sprzę­to­wa)

Któż jed­nak po­wie­dział, że ca­ła do­dat­ko­wa pa­mięć mu­si być bez przer­wy wi­docz­na i do­stęp­na dla pro­ce­so­ra? Już w świe­cie 8-bi­to­wych mi­kro­kom­pu­te­rów sto­so­wa­no prze­cież me­cha­niz­my dzie­le­nia pa­mię­ci na roz­łącz­ne ban­ki, z któ­rych tyl­ko kil­ka by­ło w da­nym mo­men­cie włą­czo­nych w prze­strzeń adre­so­wą mi­kro­pro­ce­so­ra. Wystarczała jed­na ope­rac­ja za­pi­su kon­fi­gu­rac­ji do por­tu, by pod adre­sa­mi uży­wa­ny­mi jesz­cze przed chwi­lą przez je­den z ban­ków po­ja­wiał się in­ny. Korzysta­nie z tak ban­ko­wa­nej pa­mię­ci nie by­ło wy­god­ne ze wzglę­du na ko­niecz­ny ma­ły roz­miar ban­ków (za­zwy­czaj 16 KiB), te­raz jed­nak bank mógł­by być znacz­nie więk­szy: do wy­ko­rzys­ta­nia był prze­cież ca­ły seg­ment 64 KiB w ob­sza­rze włas­nej pa­mię­ci kart roz­sze­rza­ją­cych!

Tak na­ro­dził się stan­dard EMS. Idea by­ła pros­ta: na do­dat­ko­wej kar­cie roz­sze­rza­ją­cej umiesz­cza­no oprócz pa­mię­ci rów­nież re­jestr kon­fi­gu­ra­cyj­ny i pros­ty de­ko­der adre­so­wy. Program przy­sto­so­wa­ny do pra­cy z ta­ką kar­tą mógł, za­pi­su­jąc od­po­wied­nie nu­me­ry ban­ków w re­jest­rach kon­fi­gu­ra­cyj­nych, spo­wo­do­wać po­ja­wie­nie się wska­za­nych ban­ków w od­po­wied­nim ob­sza­rze prze­strze­ni adre­so­wej (w tak zwa­nym oknie EMS). Rozmiar ban­ku wy­no­sił 16 KiB, co umoż­li­wia­ło jed­no­czes­ne ko­rzy­sta­nie z czte­rech do­wol­nych frag­men­tów pa­mię­ci EMS lub łą­cze­nie kil­ku przy­leg­łych ban­ków w więk­szy, ciąg­ły blok.

Przykład włą­cze­nia czte­rech 16-ki­lo­baj­to­wych ban­ków pa­mię­ci znaj­du­ją­cej się na osob­nej kar­cie roz­sze­rza­ją­cej w prze­strzeń adre­so­wą mi­kro­pro­ce­so­ra

Ponie­waż ta­ki me­cha­nizm szyb­ko do­pro­wa­dził­by do uza­leż­nie­nia pro­gra­mów od kon­kret­nych mo­de­li kart, fir­my Lotus, IntelMicro­soft wspól­nie opra­co­wa­ły i opu­bli­ko­wa­ły de­fi­ni­cję stan­dar­du oraz opra­co­wa­ły pro­gra­my ob­słu­gi dla sys­te­mu MS-DOS, po­śred­ni­czą­ce mię­dzy apli­kac­ją a kar­tą roz­sze­rza­ją­cą. Niezależni pro­du­cen­ci kart EMS nie mu­sie­li two­rzyć pro­duk­tów zgod­nych sprzę­to­wo: wy­star­czy­ło, aby udos­tęp­ni­li ob­słu­gu­ją­cy ich kar­ty pro­gram ob­słu­gi EMS, by opro­gra­mo­wa­nie mog­ło wy­ko­rzys­tać roz­sze­rze­nie pa­mię­ci. Standard na­zwa­no LIM EMS.

Pamięć EMS szyb­ko zo­sta­ła wy­ko­rzy­sta­na przez wszyst­kie po­waż­ne pro­gra­my i śro­do­wis­ka. Niezależnym apli­kac­jom (ta­kim jak Lotus 1-2-3) umoż­li­wia­ła zmiesz­cze­nie w pa­mię­ci wszyst­kich wy­ko­rzys­ty­wa­nych na­kła­dek, dzię­ki cze­mu użyt­kow­nik nie mu­siał cze­kać na za­ła­do­wa­nie z dys­kiet­ki po­trzeb­ne­go frag­men­tu ko­du za każ­dym wy­wo­ła­niem da­nej funk­cji. Graficz­ne śro­do­wis­ka opera­cyj­ne, ta­kie jak Micro­soft Win­dows 1.0, wy­ko­rzys­ty­wa­ły pa­mięć EMS do prze­cho­wy­wa­nia nie miesz­czą­cych się w pa­mię­ci pod­sta­wo­wej seg­men­tów, zna­czą­co zmniej­sza­jąc częs­to­tli­wość wy­mia­ny da­nych mię­dzy pa­mię­cią a dys­kiem twar­dym. I choć pa­mięć EMS by­ła po­wol­na (wol­niej­sza za­zwy­czaj, niż pa­mięć głów­na) a ko­rzy­sta­nie z niej by­ło utrud­nio­ne (choć nie­wie­le bar­dziej, niż ze skom­pli­ko­wa­ne­go, seg­men­to­we­go po­dzia­łu pa­mię­ci głów­nej), sta­no­wi­ła do­wód, że ko­lej­ne mo­de­le kom­pu­te­rów mu­szą za­kła­dać moż­li­wość roz­sze­rza­nia pa­mię­ci: 640 ki­lo­baj­tów prze­sta­ło tak na­praw­dę wy­star­czać prak­tycz­nie wszyst­kim.

80286

Pamięć Extended

Projekt­an­ci mi­kro­pro­ce­so­ra Intel 80286, 16-bi­to­we­go kon­ty­nua­to­ra linii za­po­cząt­ko­wa­nej przez 8086, na­uczy­li się na pa­mięć li­sty nie­do­sko­na­ło­ści swo­je­go po­przed­nie­go „dziec­ka” i, two­rząc no­wy układ, po­sta­no­wi­li je zlik­wi­do­wać. Wystarczy­ło roz­sze­rzyć ma­gi­stra­lę adre­so­wą o czte­ry bi­ty, by fi­zycz­na prze­strzeń adre­so­wa roz­sze­rzy­ła się z jed­ne­go do szes­na­stu me­ga­baj­tów. Biorąc pod uwa­gę, że kar­ty roz­sze­rzeń EMS rzad­ko za­wie­ra­ły wię­cej niż dwa me­ga­baj­ty pa­mię­ci, za­ło­żo­no czte­ro­krot­ny nad­miar — wy­da­wa­ło­by się, wy­star­cza­ją­cy.

Postanowio­no też roz­pra­wić się z naj­więk­szym prob­le­mem mi­kro­kom­pu­te­ra wy­po­sa­żo­ne­go w po­jem­ną pa­mięć: bra­kiem se­pa­ra­cji jed­no­cześ­nie dzia­ła­ją­cych pro­gra­mów. Mikropro­ce­sor 80286 ob­słu­gi­wał pa­mięć wir­tu­al­ną i po­zwa­lał pro­gra­mis­tom sys­te­mo­wym na ideal­ne roz­dzie­le­nie sys­te­mu opera­cyj­ne­go od apli­kac­ji i sa­mych apli­kac­ji od sie­bie na­wza­jem: żad­na z nich nie mog­ła ko­rzy­stać z blo­ków pa­mię­ci na­le­żą­cych do in­ne­go pro­gra­mu.

Niestety, dą­żąc do peł­nej zgod­no­ści z ukła­dem 8086 i za­kła­da­jąc krót­ki ży­wot pry­mi­tyw­ne­go sys­te­mu MS-DOS, roz­sze­rzo­na (ang. ex­ten­ded) pa­mięć do­stęp­na by­ła wy­łącz­nie w nad­zo­ro­wa­nym (chro­nio­nym, ang. pro­tec­ted) try­bie pra­cy mi­kro­pro­ce­so­ra, nie­zgod­nym z 8086. Tryb zgod­no­ści, naz­wa­ny rze­czy­wis­tym (ang. real), na­dal obar­czo­ny był me­ga­baj­to­wym li­mi­tem fi­zycz­nej prze­strze­ni adre­so­wej. W re­zul­ta­cie pro­gra­my MS-DOS nie mog­ły w ogó­le ko­rzy­stać z me­ga­baj­tów pa­mię­ci moż­li­wych do za­in­sta­lo­wa­nia na pły­cie głów­nej IBM PC/AT i znów ko­niecz­ne by­ło ra­to­wa­nie się kar­ta­mi roz­sze­rza­ją­cy­mi EMS.

Pamięć roz­sze­rzo­na kom­pu­te­rów IBM PC/AT do­stęp­na by­ła wy­łącz­nie w try­bie nad­zo­ro­wa­nym pra­cy mi­kro­pro­ce­so­ra 80286; na ry­sun­ku ma­pa pa­mię­ci kom­pu­te­ra wy­po­sa­żo­ne­go w 1 MiB pa­mię­ci fi­zycz­nej

Co gor­sza, wy­ko­rzys­ta­nie do­dat­ko­wej pa­mię­ci nie by­ło pros­te rów­nież w try­bie nad­zo­ro­wa­nym. BIOS kom­pu­te­ra PC/AT zo­stał roz­sze­rzo­ny je­dy­nie o moż­li­wość po­bie­ra­nia in­for­mac­ji o iloś­ci do­dat­ko­wej pa­mię­ci, bez ja­kie­go­kol­wiek spo­so­bu na za­alo­ko­wa­nie częś­ci z niej lub zwol­nie­nie uży­wa­ne­go blo­ku. Konstrukto­rzy za­ło­ży­li, że pa­mię­cią bę­dzie za­rzą­dzał przy­szły sys­tem opera­cyj­ny pra­cu­ją­cy w try­bie nad­zo­ro­wa­nym (na przy­kład OS/2) i ko­rzy­sta­nie z pro­gra­mu BIOS bę­dzie nie tyl­ko zbęd­ne, ale i nie­moż­li­we.

Pamięć Extended, jak za­czę­to ją na­zy­wać, nie mia­ła za­tem żad­ne­go prak­tycz­ne­go za­sto­so­wa­nia. Producenci sprzę­tu mu­sie­li do­pie­ro za­sta­no­wić się, ja­ki z niej zro­bić uży­tek.

Obszar HMA

Co sta­nie się, gdy do 20-bi­to­wej licz­by bi­nar­nej za­wie­ra­ją­cej sa­me je­dyn­ki do­da się jesz­cze je­den? Na sku­tek prze­peł­nie­nia licz­ba „za­wi­nie się” z po­wro­tem do ze­ra. Jeżeli tę sa­mą sztucz­kę zro­bi­my jed­nak z 21-bi­to­wą licz­bą za­wie­ra­ją­cą je­dyn­ki wszę­dzie po­za naj­bar­dziej zna­czą­cą po­zyc­ją, uzys­ka­my zu­peł­nie in­ny wy­nik: 20 mniej zna­czą­cych bi­tów wy­ze­ru­je się, a jed­na je­dyn­ka po­ja­wi się na po­zyc­ji o wa­dze 220.

Takie „prze­ocze­nie” po­ja­wi­ło się właś­nie w ukła­dzie 80286. W sytu­acji, w któ­rej pro­ce­sor 8086 wy­zna­czał adre­sy tra­fia­ją­ce w po­czą­tek pa­mię­ci fi­zycz­nej, 80286 mógł wy­ge­ne­ro­wać od­wo­ła­nie do pierw­sze­go me­ga­baj­ta pa­mię­ci roz­sze­rzo­nej na­wet w try­bie rze­czy­wis­tym pra­cy pro­ce­so­ra. Ponie­waż nie­któ­re pro­gra­my z róż­nych po­wo­dów wy­ko­rzys­ty­wa­ły sztucz­kę z „za­wi­nię­ciem do ze­ra”, pro­jek­tan­ci kom­pu­te­ra PC/AT nie mog­li zigno­ro­wać prob­le­mu i umieś­ci­li na pły­cie głów­nej ste­ro­wa­ną pro­gra­mo­wo bram­kę blo­ku­ją­cą na żą­da­nie li­nię adre­so­wą A20: blo­ka­da by­ła uaktyw­nia­na w cza­sie uru­cha­mia­nia kom­pu­te­ra, wy­łą­czać miał ją zaś do­pie­ro sys­tem opera­cyj­ny pra­cu­ją­cy w try­bie nad­zo­ro­wa­nym, przy­sto­so­wa­ny do ob­słu­gi ca­łej po­jem­noś­ci pa­mię­ci i nie po­zwa­la­ją­cy na ta­kie sztucz­ki z za­wi­ja­niem adre­sa­cji.

Okazało się jed­nak, że coś, co do­tych­czas roz­pat­ry­wa­no w ka­te­gorii do­kucz­li­wej nie­kom­pa­ty­bil­noś­ci, jest re­we­la­cyj­ną funk­cją: bez prze­cho­dze­nia w tryb nad­zo­ro­wa­ny uzys­ki­wa­ło się do­stęp do nie­ca­łe­go 64-ki­lo­baj­to­we­go seg­men­tu pa­mię­ci roz­sze­rzo­nej! Może się dzi­siaj wy­da­wać, że 64 KiB to nie­du­żo, jed­nak w za­tło­czo­nej ma­pie pa­mię­ci sys­te­mu MS-DOS zna­czy­ło to bar­dzo wie­le. Do do­dat­ko­wych 65 520 baj­tów pa­mię­ci, do­stęp­nych po za­ła­do­wa­niu re­jest­rów seg­men­to­we­go i in­dek­so­we­go war­toś­cia­mi FFFF:0010h, moż­na by­ło prze­nieść pro­gra­my ob­słu­gi urzą­dzeń, bu­fo­ry sys­te­mu opera­cyj­ne­go czy nie­wiel­kie pro­gra­my re­zy­dent­ne, do­tych­czas współ­dzie­lą­ce pa­mięć z pro­gra­ma­mi użyt­ko­wy­mi.

Obszar HMA znaj­du­je się za­raz na po­cząt­ku pa­mię­ci roz­sze­rzo­nej i obej­mu­je nie­ca­łe 64 ki­lo­baj­ty

Nowo uzys­ka­ny ob­szar, naz­wa­ny HMA, miał spo­ro ogra­ni­czeń. Dostępny był w spo­sób sek­wen­cyj­ny, a więc raz przy­zna­ny pro­gra­mo­wi blok pa­mię­ci HMA nie mógł być już zwol­nio­ny aż do wy­łą­cze­nia kom­pu­te­ra. Progra­my z nie­go ko­rzy­sta­ją­ce nie mog­ły też czy­nić żad­nych za­ło­żeń co do re­jest­rów adre­so­wych. Jeśli jed­nak uda­ło się HMA pra­wid­ło­wo skon­fi­gu­ro­wać, zys­ki­wa­ło się kil­ka­naś­cie lub kil­ka­dzie­siąt ki­lo­baj­tów pa­mię­ci pod­sta­wo­wej bez utra­ty funkcjo­nal­noś­ci.

Pamięć EMS

Pamięć EMS ko­ja­rzo­na by­ła do­tych­czas wy­łącz­nie z od­ręb­ny­mi kar­ta­mi roz­sze­rzeń. Ponie­waż jed­nak stan­dard EMS za­do­mo­wił się wśród apli­kac­ji, a roz­sze­rzo­na pa­mięć kom­pu­te­rów AT by­ła częs­to bez­uży­tecz­na, nie­któ­rzy pro­du­cen­ci płyt głów­nych po­sta­no­wi­li po­łą­czyć jed­no z dru­gim i udos­tęp­nić pa­mięć roz­sze­rzo­ną ja­ko EMS.

Nie by­ło to spe­cjal­nie trud­ne. Wystarczy­ło umieś­cić mię­dzy pro­ce­so­rem a pa­mię­cią układ ban­ku­ją­cy, za­mie­nia­ją­cy od­wo­ła­nia do ob­sza­ru ok­na EMS (umiesz­czo­ne­go w pierw­szym me­ga­baj­cie prze­strze­ni adre­so­wej) na ope­rac­je od­czy­tu i za­pi­su do 16-ki­lo­baj­to­we­go blo­ku umiesz­czo­ne­go w pa­mię­ci roz­sze­rzo­nej. Jeszcze tyl­ko od­po­wied­ni pro­gram ob­słu­gi EMS dla sys­te­mu MS-DOS i go­to­we: pa­mięć roz­sze­rzo­na prze­sta­je być do­stęp­na w nor­mal­ny spo­sób, sta­jąc się pa­mię­cią EMS.

Sprzętowa emu­lac­ja roz­sze­rze­nia pa­mię­ci EMS za po­mo­cą pa­mię­ci roz­sze­rzo­nej w kom­pu­te­rze ty­pu IBM PC/AT z 1 MiB za­mon­to­wa­nej pa­mię­ci; układ ste­ru­ją­cy pra­cą pły­ty głów­nej do­ko­nu­je włą­cze­nia wy­bra­nych ban­ków pa­mię­ci roz­sze­rzo­nej w stan­dar­do­we okno EMS

Na do­brą spra­wę im­ple­men­tac­ja pa­mię­ci EMS mog­ła­by być zreali­zo­wa­na na­wet w spo­sób cał­ko­wi­cie pro­gra­mo­wy. Wystarczy­ło, by pro­gram ob­słu­gi EMS re­zer­wo­wał ob­szar 64 KiB w pa­mię­ci pod­sta­wo­wej ja­ko okno EMS, a ope­rac­je zmia­ny ak­tyw­ne­go ban­ku re­ali­zo­wał prze­łą­cza­jąc pro­ce­sor w tryb nad­zo­ro­wa­ny, ko­piu­jąc 16 KiB da­nych mię­dzy oknem a pa­mię­cią roz­sze­rzo­ną, a na ko­niec wra­ca­jąc do try­bu rze­czy­wi­ste­go. Żałosna wy­daj­ność ta­kie­go roz­wią­za­nia, spo­wo­do­wa­na z jed­nej stro­ny ko­niecz­noś­cią ciąg­łe­go ko­pio­wa­nia da­nych, a z dru­giej bra­kiem sen­sow­nej i szyb­kiej me­to­dy wra­ca­nia z try­bu nad­zo­ro­wa­ne­go do rze­czy­wi­ste­go, czy­ni­ła je jed­nak ma­ło prak­tycz­nym. Taka reali­zac­ja EMS cza­sem też wię­cej by szko­dzi­ła niż po­ma­ga­ła: pod­czas gdy sprzę­to­we reali­za­cje stan­dar­du EMS wy­ko­rzys­ty­wa­ły pu­sty (nie ob­sa­dzo­ny pa­mię­cią fi­zycz­ną) ob­szar prze­strze­ni adre­so­wej pro­ce­so­ra, pro­gra­mo­we EMS za­bie­ra­ło­by pro­gra­mom 64 KiB pa­mię­ci pod­sta­wo­wej, by stwo­rzyć włas­ne okno słu­żą­ce do ko­pio­wa­nia ban­ków z pa­mię­ci roz­sze­rzo­nej.

Pamięć XMS

Pamięć EMS speł­nia­ła swo­je za­da­nie cał­kiem nie­źle. Mimo to, za­leż­ność od do­brej wo­li pro­du­cen­ta pły­ty głów­nej (któ­ry mu­siał za­im­ple­men­to­wać ob­wód ob­słu­gu­ją­cy prze­łą­cza­nie ban­ków EMS) i ma­ła ilość do­stęp­nej jed­no­cześ­nie pa­mię­ci do­dat­ko­wej (do 64 KiB) spo­wo­do­wa­ły, że za­czę­to szu­kać lep­sze­go roz­wią­za­nia.

Znaleziono je w for­mie spe­cy­fi­ka­cji XMS, opra­co­wa­nej przez fir­mę Micro­soft i za­im­ple­men­to­wa­nej w sys­te­mie MS-DOS za po­mo­cą pro­gra­mu re­zy­dent­ne­go HIMEM.SYS (ob­słu­gi­wał on zresz­tą rów­nież blo­ki pa­mię­ci HMA). Specyfi­ka­cja by­ła bar­dzo pros­ta: pro­gram mógł za­alo­ko­wać blok pa­mię­ci, zwol­nić go, sko­pio­wać z lub do pa­mię­ci pod­sta­wo­wej al­bo za­blo­ko­wać w pa­mię­ci roz­sze­rzo­nej, unie­moż­li­wia­jąc je­go prze­miesz­cza­nie w za­leż­noś­ci od po­trzeb. Chociaż ta­ka pros­to­ta umoż­li­wia­ła wy­ko­rzys­ta­nie pa­mię­ci roz­sze­rzo­nej XMS je­dy­nie do prze­cho­wy­wa­nia blo­ków da­nych oraz na­kła­dek pro­gra­mo­wych (pod­czas gdy z pa­mię­ci EMS moż­na by­ło bez­po­śred­nio uru­cha­miać kod tych na­kła­dek), a za­miast prze­łą­cze­nia ban­ków trze­ba by­ło zdać się na po­wol­ne ko­pio­wa­nie (chy­ba, że pro­gra­mis­ta zde­cy­do­wał się na chwi­lo­we przej­ście w tryb nad­zo­ro­wa­ny i bez­po­śred­nie prze­two­rze­nie da­nych), to jed­nak pa­mięć XMS mia­ła jed­ną nie­za­prze­czal­ną za­le­tę: by­ła do­stęp­na na pra­wie każ­dym kom­pu­te­rze z pro­ce­so­rem 80286.

Program ob­słu­gi HIMEM.SYS za­rzą­dza blo­ka­mi pa­mię­ci XMS re­zer­wo­wa­ny­mi przez po­szcze­gól­ne apli­kac­je i reali­zu­je w ich imie­niu ope­ra­cję ko­pio­wa­nia lub prze­no­sze­nia blo­ków da­nych z i do pa­mię­ci XMS

Jako że mi­kro­kom­pu­te­ry z pro­ce­so­ra­mi 8086 i 8088 od­cho­dzi­ły po­wo­li do prze­szłoś­ci (a wraz z ni­mi kar­ty roz­sze­rzeń EMS), stan­dard XMS za­czął być sze­ro­ko wy­ko­rzys­ty­wa­ny. W grun­cie rze­czy sko­pio­wa­nie kil­ku­dzie­się­ciu ki­lo­baj­tów da­nych lub ko­du z jed­ne­go miej­sca pa­mię­ci w dru­gie by­ło i tak szyb­sze, niż po­bra­nie ich z dys­kiet­ki lub dys­ku twar­de­go. Rozwiąza­nie nie­co spraw­niej­sze (w po­sta­ci EMS) mu­sia­ło ulec no­wo­cześ­niej­sze­mu.

80386

Pamięć Extended i ob­szar HMA

Procesor Intel 80386 (i now­sze, zgod­ne z nim mo­de­le) nie wpro­wa­dzał wie­le no­we­go w za­kre­sie ob­słu­gi pa­mię­ci roz­sze­rzo­nej. Najważniej­szą zmia­ną by­ło roz­sze­rze­nie fi­zycz­nej prze­strze­ni adre­so­wej z 16 MiB do 4 GiB. Wreszcie zlik­wi­do­wa­no też po­dział pa­mię­ci na 64-ki­lo­baj­to­we seg­men­ty, wpro­wa­dza­jąc peł­ną do­wol­ność roz­mia­ru seg­men­tu aż do przy­pad­ku skraj­ne­go — jed­ne­go seg­men­tu obej­mu­ją­ce­go ca­łą pa­mięć. Obowiązko­wą do­tych­czas przy wy­ko­rzys­ta­niu pa­mię­ci wir­tu­al­nej seg­men­ta­cję uzu­peł­nio­no stro­ni­co­wa­niem pa­mię­ci.

Zachowa­no też szcze­gól­ną „właś­ci­wość” pro­ce­so­ra 80286, po­le­ga­ją­cą na moż­li­woś­ci uzys­ka­nia do­stę­pu do nie­ca­łe­go pierw­sze­go 64-ki­lo­baj­to­we­go seg­men­tu pa­mię­ci roz­sze­rzo­nej z po­zio­mu try­bu rze­czy­wi­ste­go. Dzięki te­mu blok HMA do­stęp­ny był na iden­tycz­nych za­sa­dach, zna­czą­co zwięk­sza­jąc swo­bo­dę pra­cy sys­te­mu MS-DOS.

Pamięć EMS

Mechaniz­my stro­ni­co­wa­nia i ma­szy­ny wir­tu­al­nej VM86 umoż­li­wi­ły zde­cy­do­wa­ną zmia­nę spo­so­bu ob­słu­gi stan­dar­du EMS. Najnowsze wer­sje pro­gra­mu ob­słu­gi EMM386.EXE, od­po­wie­dzial­ne­go za pro­gra­mo­wą emu­lac­ję pa­mię­ci EMS w sys­te­mie MS-DOS, w przy­pad­ku wy­kry­cia pro­ce­so­ra 80386 prze­łą­cza­ły go w tryb nad­zo­ro­wa­ny, uru­cha­mia­ły ma­szy­nę wir­tu­al­ną VM86 (umoż­li­wia­jąc w ten spo­sób nor­mal­ną pra­cę sys­te­mu MS-DOS i je­go apli­kac­ji) po czym włą­cza­ły wy­bra­ne ban­ki EMS w ob­szar ok­na ko­rzy­sta­jąc z me­cha­niz­mu stro­ni­co­wa­nia. Przełącze­nie ban­ku by­ło na­tych­mias­to­we, nie wy­ma­ga­ło ko­pio­wa­nia da­nych, a co naj­waż­niej­sze — dzia­ła­ło na każ­dym kom­pu­te­rze bez wzglę­du na to, czy pro­du­cent pły­ty głów­nej prze­wi­dział ob­słu­gę stan­dar­du EMS. Emulacja by­ła tak do­bra, że wszyst­kie sprzę­to­we im­ple­men­tac­je EMS, wy­stę­pu­ją­ce jesz­cze cza­sem w epo­ce kom­pu­te­rów PC/AT, za­nik­nę­ły cał­ko­wi­cie.

Jednym z waż­niej­szych uspraw­nień ob­słu­gi EMS w okre­sie schył­ko­wym by­ło dyna­micz­ne two­rze­nie ok­na EMS. Dotych­czas wy­star­czy­ło, by je­den pro­gram w cza­sie ses­ji wy­ma­gał do­stęp­noś­ci pa­mię­ci EMS, by ko­niecz­ne by­ło re­zer­wo­wa­nie blo­ku 64 KiB cen­nej pa­mię­ci pod­sta­wo­wej. Nowe wer­sje pro­gra­mu EMM386.EXE two­rzy­ły okno EMS do­pie­ro w mo­men­cie, gdy któ­ryś z pro­gra­mów re­zer­wo­wał pierw­szy blok pa­mię­ci EMS i nisz­czy­ły je (zwal­nia­jąc ob­szar pa­mię­ci), gdy ob­słu­ga EMS prze­sta­wa­ła być po­trzeb­na. W sytu­acji, gdy każ­dy ki­lo­bajt był na wa­gę zło­ta, by­ła to nie­zwyk­le istot­na opty­ma­li­zac­ja.

Co mo­że waż­niej­sze, pro­gram EMM386.EXE po­tra­fi też two­rzyć okno EMS nie w ob­sza­rze pa­mię­ci przy­na­leż­nym sys­te­mo­wi ope­ra­cyj­ne­mu, lecz w nie­wy­ko­rzys­ta­nych frag­men­tach ostat­nich 384 KiB pierw­sze­go me­ga­baj­ta prze­strze­ni adre­so­wej. Wyszukuje on 64 KiB ciąg­łe­go ob­sza­ru nie­uży­wa­ne­go przez żad­ną kar­tę roz­sze­rza­ją­cą i za po­mo­cą me­cha­niz­mu stro­ni­co­wa­nia umiesz­cza w nim ban­ki pa­mię­ci EMS. W ten spo­sób moż­na uzys­kać ob­słu­gę EMS pra­wie „za dar­mo”, w za­sa­dzie na iden­tycz­nych wa­run­kach, jak w przy­pad­ku roz­wią­za­nia sprzę­to­we­go.

Ostatnie wer­sje pro­gra­mu EMM386.EXE po­tra­fią wy­ko­rzys­tać moż­li­wość pra­cy pro­ce­so­ra 80386 w try­bie wir­tu­al­nym, by za po­mo­cą me­cha­niz­mu stro­ni­co­wa­nia umie­szczać frag­men­ty pa­mię­ci roz­sze­rzo­nej w ob­sza­rze pa­mię­ci za­re­zer­wo­wa­nym nor­mal­nie na po­trze­by kart roz­sze­rzeń, w sy­mu­lo­wa­nym oknie EMS

Bloki UMB

Program EMM386.EXE po­tra­fi zmieś­cić w nie­wy­ko­rzys­ta­nych wy­cin­kach prze­strze­ni adre­so­wej nie tyl­ko okno EMS. Dzięki me­cha­niz­mo­wi stro­ni­co­wa­nia moż­na w nie­uży­wa­ne miej­sca pod­sta­wić stro­ny pa­mię­ci roz­sze­rzo­nej, uzys­ku­jąc do­dat­ko­we blo­ki pa­mię­ci do­stęp­ne w try­bie rze­czy­wis­tym.

Na pierw­szy rzut oka roz­wią­za­nie to przy­po­mi­na bar­dzo blok HMA. O ile jed­nak HMA ma sta­ły roz­miar rów­ny nie­speł­na 64 KiB, blo­ki UMB po­wsta­łe w ten spo­sób mo­gą w su­mie mieć po­jem­ność prze­kra­cza­ją­cą na­wet 128 KiB. Niestety, za­zwy­czaj ob­szar ten jest moc­no po­frag­men­to­wa­ny i skła­da się z kil­ku od­ręb­nych ob­sza­rów o roz­mia­rze od kil­ku­na­stu do kil­ku­dzie­się­ciu ki­lo­baj­tów. Jego wy­ko­rzys­ta­nie wy­ma­ga ze stro­ny sys­te­mu opera­cyj­ne­go spraw­ne­go wy­szu­ki­wa­nia naj­mniej­sze­go blo­ku speł­nia­ją­ce­go wy­ma­ga­nia ła­do­wa­ne­go do UMB pro­gra­mu, zaś ze stro­ny użyt­kow­ni­ka — spo­ro spry­tu oraz eks­pe­ry­men­tal­ne­go do­bra­nia ko­lej­noś­ci wpro­wa­dza­nia pro­gra­mów do blo­ków UMB.

Bloki UMB zaj­mu­ją wol­ne miej­sca w prze­strze­ni adre­so­wej pro­ce­so­ra; mo­gą być tam prze­ma­po­wa­ne (za po­mo­cą me­cha­niz­mu stro­ni­co­wa­nia) stro­ny pa­mię­ci z ob­sza­ru pa­mię­ci roz­sze­rzo­nej, al­bo włą­czo­ne stro­ny pa­mię­ci fi­zycz­nej le­żą­ce w tym ob­sza­rze prze­strze­ni adre­so­wej i nor­mal­nie ukry­te

Bloki UMB przy­wra­ca­ły ży­cie sys­te­mo­wi MS-DOS, z wer­sji na wer­sję zwięk­sza­ją­ce­mu swój roz­miar i z ro­ku na rok ob­ras­ta­ją­ce­go pro­gra­ma­mi ob­słu­gi ku­po­wa­nych przez użyt­kow­ni­ków pe­ry­fe­riów. Choć apli­kac­je co­raz częś­ciej się­ga­ły po tryb nad­zo­ro­wa­ny i bez­po­śred­nio ko­rzy­sta­ły z ca­łej do­stęp­nej pa­mię­ci kom­pu­te­ra, star­sze pro­gra­my do­sta­wa­ły no­wą szan­sę spraw­nej pra­cy. Pełne wy­ko­rzys­ta­nie blo­ków HMAUMB po­zwa­la­ło wy­gos­po­da­ro­wać w pa­mię­ci pod­sta­wo­wej aż 620 KiB wol­nej prze­strze­ni na pro­gra­my: wię­cej, niż za cza­sów pierw­szej wer­sji MS-DOS.

Konfiguracja pa­mię­ci w sys­te­mie MS-DOS

Przy ty­lu róż­nych ro­dza­jach pa­mię­ci i zbio­rze pro­gra­mów, z któ­rych każ­dy ob­słu­gi­wał in­ny stan­dard roz­sze­rze­nia pa­mię­ci, użyt­kow­nik sys­te­mu MS-DOS mu­siał la­wi­ro­wać po­mię­dzy pro­gra­ma­mi ob­słu­gi oraz ob­sza­ra­mi pa­mię­ci, do­bie­ra­jąc kom­pro­mi­so­wą kon­fi­gu­rac­ję pa­mię­ci al­bo zmie­nia­jąc ją co chwi­lę w za­leż­noś­ci od po­trzeb. Dopiero ostat­nie wcie­le­nia sys­te­mu MS-DOS ogra­ni­czy­ły nie­co ten prob­lem, za­nim gwał­tow­na mi­grac­ja do sys­te­mów 32-bi­to­wych nie usu­nęła go raz na zaw­sze w cień.

Kompute­ry kla­sy PC/XT

Użytkow­nik kom­pu­te­ra zgod­ne­go z IBM PC/XT nie miał spe­cjal­ne­go wy­bo­ru, je­że­li cho­dzi o wy­ko­rzys­ta­nie pa­mię­ci roz­sze­rzo­nej. Jedynym moż­li­wym spo­so­bem roz­sze­rze­nia pa­mię­ci by­ła kar­ta pa­mię­ci EMS i zgod­ne ze stan­dar­dem EMS opro­gra­mo­wa­nie. Nie da­wa­ło to oczy­wiś­cie moż­li­woś­ci zwol­nie­nia więk­szej iloś­ci pa­mię­ci pod­sta­wo­wej, trze­ba by­ło za­tem re­zyg­no­wać ze zbęd­nych pro­gra­mów re­zy­dent­nych, ko­rzy­stać ze star­szych, lecz oszczęd­niej­szych wer­sji sys­te­mu MS-DOS i ob­cho­dzić się sma­kiem wi­dząc no­we, lecz wy­ma­ga­ją­ce mnóst­wa pa­mię­ci wer­sje apli­kac­ji.

Kompute­ry kla­sy PC/AT

Komputer kla­sy PC/AT da­wał znacz­nie więk­sze moż­li­woś­ci kształ­to­wa­nia śro­do­wis­ka pra­cy. Wystarczy­ło, by kom­pu­ter był wy­po­sa­żo­ny w 1 MiB pa­mię­ci opera­cyj­nej, by po­ja­wia­ło się 384 KiB pa­mię­ci roz­sze­rzo­nej. Niecałe 64 KiB z niej od ra­zu two­rzy­ło ob­szar HMA, wy­ko­rzys­ty­wa­ny przez now­sze wer­sje MS-DOS do bu­fo­ro­wa­nia da­nych oraz ła­do­wa­nia pro­gra­mów ob­słu­gi urzą­dzeń.

Szczęśliwi po­sia­da­cze nie­któ­rych płyt głów­nych AT, wy­po­sa­żo­nych w sprzę­to­wą ob­słu­gę stan­dar­du EMS, po za­ła­do­wa­niu jed­ne­go pro­gra­mu ob­słu­gi mog­li wy­ko­rzys­ty­wać ca­łą roz­sze­rzo­ną pa­mięć ja­ko EMS. Ponie­waż bi­blio­te­ka opro­gra­mo­wa­nia zgod­ne­go z EMS by­ła względ­nie sze­ro­ka, zwięk­sze­nie wy­daj­noś­ci i wy­go­dy pra­cy ogra­ni­cza­ło się w ta­kim przy­pad­ku do uzu­peł­nie­nia pod­sta­wek na pły­cie głów­nej kom­pu­te­ra lub wsta­wie­nia mo­du­łów pa­mię­ci w gniaz­da SIPP. Pozostali użyt­kow­ni­cy byli ska­za­ni na po­wol­ne, pro­gra­mo­we roz­wią­za­nia EMS, lub na szu­ka­nie pro­gra­mów dzia­ła­ją­cych w try­bie nad­zo­ro­wa­nym lub przy­naj­mniej prze­cho­wu­ją­cych da­ne w pa­mię­ci XMS. Nieliczni tyl­ko cze­ka­li na peł­ne roz­wią­za­nie prob­le­mu, któ­re mia­ło na­dejść wraz z pre­mie­rą sys­te­mu OS/2; by­ło to jak cze­ka­nie na Godota.

Kompute­ry kla­sy 80386

W pew­nym mo­men­cie ce­ny pro­ce­so­rów 80386SX spad­ły na ty­le, że ku­po­wa­nie kom­pu­te­rów AT prze­sta­ło być opła­cal­ne. Choć 80386SX nie ofe­ro­wał ta­kiej wy­daj­noś­ci, jak „peł­no­krwis­ta” wer­sja te­go mi­kro­pro­ce­so­ra, był mi­mo wszyst­ko szyb­szy od 80286, a do te­go ofe­ro­wał ca­łą ga­mę do­dat­ko­wych moż­li­woś­ci, wy­ko­rzys­ty­wa­nych przez sys­tem MS-DOS.

Użytkow­nik kom­pu­te­ra z pro­ce­so­rem zgod­nym z 80386 mógł w bar­dzo sze­ro­kim za­kre­sie kształ­to­wać prze­strzeń adre­so­wą do­stęp­ną dla MS-DOS. Oprócz zna­ne­go z kom­pu­te­rów AT ob­sza­ru HMA, moż­na by­ło skon­fi­gu­ro­wać blo­ki UMB i prze­nieść do nich pro­gra­my ob­słu­gi urzą­dzeń, a na­wet nie­któ­re pro­gra­my re­zy­dent­ne. W star­sze pro­gra­my moż­na by­ło tchnąć no­we ży­cie, kon­fi­gu­ru­jąc ob­słu­gę pa­mię­ci EMS z dyna­micz­nie two­rzo­nym oknem. Niektóre pro­gra­my za­rzą­dza­ją­ce pa­mię­cią sto­so­wa­ły jesz­cze in­ne sztucz­ki: na przy­kład, blo­ku­jąc moż­li­wość wy­ko­rzys­ta­nia try­bu gra­ficz­ne­go i umiesz­cza­jąc w ob­sza­rze bu­fo­ra ram­ki stro­ny pa­mię­ci roz­sze­rzo­nej moż­na by­ło uzys­kać po­nad 700 KiB pa­mię­ci pod­sta­wo­wej — coś, co na­wet auto­rom sys­te­mu MS-DOS się pew­nie nig­dy nie śni­ło.

Dopiero jed­nak ostat­nie wer­sje sys­te­mu MS-DOS (i pro­gra­mu ob­słu­gi EMM386.EXE) by­ły tak elas­tycz­ne. Wcześniej­sze wy­ma­ga­ły sta­tycz­ne­go okre­śle­nia, czy uży­wa­na bę­dzie pa­mięć EMS (i na sta­łe alo­ko­wa­ły okno EMS) oraz ile tej pa­mię­ci bę­dzie po­trzeb­nej (co zmniej­sza­ło z kolei ilość wol­nej pa­mię­ci XMS). Użytkow­nik mu­siał al­bo zna­leźć kom­pro­mi­so­wą kon­fi­gu­rac­ję, umoż­li­wia­ją­cą spraw­ną pra­cę wszyst­kich pro­gra­mów, lub – je­że­li miał czas uru­cha­miać co chwi­lę kom­pu­ter od no­wa – stwo­rzyć ze­staw pro­fi­li kon­fi­gu­ra­cyj­nych, wy­bie­ra­nych z me­nu pod­czas ła­do­wa­nia sys­te­mu MS-DOS.

Pod­su­mo­wa­nie

Nowo­czes­ne, 32-bi­to­we sys­te­my opera­cyj­ne zlik­wi­do­wa­ły ja­kie­kol­wiek po­dzia­ły pa­mię­ci na ty­py i ob­sza­ry. Cała pa­mięć trak­to­wa­na jest jed­na­ko­wo od mo­men­tu uru­cho­mie­nia sys­te­mu, a pro­gra­my są od sie­bie na­wza­jem izo­lo­wa­ne, nie mo­gąc bez­po­śred­nio od­wo­ły­wać się do pa­mię­ci fi­zycz­nej czy do pa­mię­ci in­ne­go pro­ce­su.

Narzekając na po­wol­ne stro­ni­co­wa­nie lub du­żą za­ję­tość pa­mię­ci war­to pa­mię­tać o tym, że kie­dyś by­ło znacz­nie go­rzej. Progra­my led­wie mie­ści­ły się w pa­mię­ci, wy­ma­ga­ły jej roz­sze­rze­nia zgod­ne­go z kon­kret­ną spe­cy­fi­ka­cją, a pró­ba jed­no­czes­ne­go uru­cho­mie­nia kil­ku pro­gra­mów częs­to koń­czy­ła się nie­po­wo­dze­niem w mo­men­cie, gdy je­den z nich nad­pi­sy­wał pa­mięć na­le­żą­cą do dru­gie­go.

Dużo się jed­nak zmie­ni­ło od cza­sów IBM PC.


Mi się zawsze wydawało, że dopiero procesor 80386 umożliwiał obsługę pamięci stronicowanej. To z tego powodu Windows 3.1x nie uruchamiał się na procesorach 80286
1) Stronicowanie pojawiło się w 80386. W artykule jest tak napisane. O co chodzi?
2) Windows 3.1 działało na AT. Dopiero w Windows 3.11 zablokowano to.
EMS64 – EMS 4.0 simulator
A device driver & program that emulates the Lotus/Intel/Microsoft Expanded Memory Specification, Version 4.0, in software, permitting extended memory above 4GB in x64 machines to be used as expanded memory. It uses unreal mode that cannot work in virtual 8086 mode. The XMS driver must be installed before EMS64.EXE because it uses XMS memory for handles, handle names and paging tables. Ideal for creating large RAMDISK if you have more than 4GB memory and 64-bit CPU and you use DOS.
Download at: https://board.flatassembler.net/topic.php?t=19410