Pamięć PC
Granic 640 kB
„640 kB (kilobajtów) to ilość pamięci, która zaspokoi potrzeby każdego użytkownika.” Takie oto zdanie, w latach 80-tych poprzedniego stulecia, miał wygłosić Bill Gates. Czy to jest prawdą, czy nie, fakt był taki, iż komputery PC były ograniczone tą barierą wielkości(!) pamięci konwencjonalnej.
Na początku lat 90-tych platforma PC była przez ten fakt bardzo często wyśmiewana przez rywali (Amiga, Apple, Atari ST), których rozwiązania posiadały płaską strukturę pamięci.
Może nie wszyscy pamiętają, a może i nie mają prawa pamiętać, ale sposób organizacji pamięci PC powodował częste problemy z programami, które wymagały określonej wielkości pamięci konwencjonalnej. Kolejne wersje MS DOS powodowały, że było jej coraz więcej, ale też od użytkowników wymagana była wiedza (a w dobie przed Internetem była ona bardzo cenna), w jaki sposób napisać plik wsadowy autoexec.bat, by zyskać kolejne cenne kilobajty. I właśnie o tym problemie i sposobach radzenia z nim sobie poniżej.
Spuścizna XT
Pierwsze systemy IBM PC a dokładniej IBM PC/XT (Personal Computer / eXTended Technology) tworzone były na podstawie procesorów Intel 8088 (magistrala danych 8-bit), czyli ograniczonej wersji Intel 8086 (magistrala danych 16-bit). Procesory 8088 mogły zaadresować do 64kB w rejestrze i aby uzyskać dostęp do większej ilości pamięci, została ona podzielona na kilka segmentów. Przestrzeń adresowa pamięci mogła wynieść maksymalnie 1MB. Te pierwsze systemy IBM pracowały w tak zwanym trybie rzeczywistym (Legacy Mode). Charakteryzował się on tym, iż nie zapewniał ochrony pamięci przed użyciem przez inny proces oraz obsługi wielozadaniowości. Z kolei tryb chroniony (Protected Mode), który został wprowadzony wraz z procesorem Intel 286, umożliwiał pracę programów w systemie DOS w trybie chronionym, pozostawiając sam system w trybie rzeczywistym.
Podział pamięci
W 1981 roku komputer klasy IBM PC/XT mógł liczyć 1MB pamięci, co było na ten czas ogromną ilością. Warto zaznaczyć, że komputery domowe, Atari 800XL czy Commodore C-64 posiadały 64kB pamięci, a ZX Spectrum 48, jak nazwa wskazuje 48kB. 1MB w IBM PC musiał zostać podzielony na pamięć dostępną RAM, pamięć wideo i do obsługi różnych peryferii. Producent zadecydował, że dolne 640kB będzie dostępny (zarezerwowany) dla użytkownika, natomiast górne 384kB będzie używane przez urządzenia, BIOS czy pamięć wideo. Te strefy były na tyle duże by spełniać swoje zadania…
A zatem, Microsoft nie narzucił tych ograniczeń! Takie rozwiązanie stworzył IBM i poniekąd Intel!
Intel 80286
W roku 1984 IBM stwarza system IBM PC/AT (Personal Computer / Advanced Technology) oparty o procesor Intel 80286 (ok. dwa razy wydajniejszy niż Intel 8086), który jest w stanie obsłużyć do maksymalnie 16MB pamięci. Zgodność programowa z Intel 8086 została utrzymana, a więc także i sposób organizacji pamięci, czyli w trybie rzeczywistym, w którym system standardowo rozpoczynał pracę, nadal mamy dostęp do maksymalnie 1MB! Intel 80286 miał jeden wielki mankament – po przejściu do trybu chronionego nie mógł już wrócić z powrotem do trybu rzeczywistego. Jedynym sposobem był reset procesora, przez co komputery wykorzystujące go musiały mieć w ROM BIOS specjalny kod pozwalający na wykonanie tej operacji. Powodowało to jednak bardzo duże opóźnienia, a co za tym idzie obniżało znacznie wydajność procesora, gdy korzystał on z obu trybów adresowania.
Hackowanie systemu
Na szczęście niektóre programy w środowisku DOS, można było adresować w odpowiednie miejsca pamięci systemu PC. Była to praktyka powszechna…
- Uporządkujmy nazewnictwo:
- – Pamięć konwencjonalna a jest to podstawowa, najcenniejsza pamięć do maksymalnego rozmiaru **640 KB**. W MS-DOS programy powinny być wykonywane w tej przestrzeni. Dlatego, po starcie systemu, w nie zarządzonym systemie, bardzo często okazywało się, że dany program lub, o zgrozo, gra nie mogła być uruchomiona bo potrzebowała więcej pamięci konwencjonalnej niż było dostępne. I dlatego walka o każdy kilobajt była tak istotna!
- – Górny obszar pamięci (UMA – Upper Memory Area)** odnosi się do obszaru, który był zastrzeżony przez IBM dla BIOSu, karty graficznej i różnych urządzeń peryferyjnych. Pozostają jednak wolne bloki pamięci, tzw. UMB (Upper Memory Blocks). Programy MS-DOS pozwalają na umieszczenie w tych blokach sterowników, a nawet uruchamianie niektórych programów. W UMB znajdują się najczęściej programy rezydentne pracujące przez cały czas działania komputera.
- – Pamięć rozszerzona (XMS – Extended Memory) to obszar rozszerzonej pamięci niedostępny dla procesorów 8086/8088. Obsługiwany może być przez procesory Intel 80286 i wyższe dzięki zastosowaniu specjalnego sterownika w systemie (program HIMEM.SYS), który zarządza tą pamięcią oraz czuwa nad tym, aby dwa programy nie korzystały z tego samego obszaru pamięci.
Żeby było ciekawiej pojawia się HMA
Pamięć wysoka (HMA – High Memory Area) to obszar pamięci, który powstawał w trybie rzeczywistym dla procesorów Intel 286 i wyższych z powodu posiadania 24 rejestrów, a nie tak jak w przypadku procesorów 8088/8086 tylko 20. Dzięki temu wykorzystać można było dodatkowe 65536-16 B pamięci (czyli prawie 64 kB). I to jest właśnie HMA. Wykorzystuje się ją najczęściej do umieszczania buforów i sterowników urządzeń, dzięki czemu więcej pamięci konwencjonalnej może być przydzielone na potrzeby programów.
Od wersji MS-DOS 5.0, w systemach z procesorami 286 w górę, do HMA można było załadować jego główny program poprzez umieszczenie polecenia DOS=HIGH w pliku CONFIG.SYS.
Mapa pamięci w systemie DOS
Standard EMS
W roku 1985 trzy firmy Lotus(!), Intel i Microsoft ogłosiły nowy system zarządzania pamięcią rozszerzoną – Extended Memory Specification. Obszar pierwszych 64 kB (zwany teraz EMS window) niewykorzystanych w górnym obszarze pamięci (UMA) podzielono na cztery banki po 16 kB. Sprzętowo wspierany mechanizm, wraz z odpowiednimi driverami DOS (notabene zużywających kilka kB pamięci konwencjonalnej), powodował dostęp do dowolnego miejsca w obszarze pamięci rozszerzonej, właśnie za pośrednictwem 4 baków. Dawało to dostęp do całej pamięci 16MB nawet w trybie rzeczywistym.
Sposób działania ESM przy wykorzystaniu banków 16kB
Zarówno EMS, jak i XMS wymagają wolnych bloków w górnym obszarze pamięci (UMA). Jeśli nie ma tam wystarczającej liczby wolnych bloków dostępnych dla obu, użytkownik musi wybrać, z jakiego standardu będzie korzystał i odpowiednio skonfigurować pliki rozruchowe. Pod uwagę należy wziąć jakie programy będzie się uruchamiać. Konfiguracja MS-DOS na 286 nie była przeznaczona dla ludzi o słabych nerwach!
Premiera 386
Intel, projektując nowy procesor 80386, dobrze wiedział, że kompatybilność wsteczna z 8086 jest jego głównym atutem.
- Z tej przyczyny w nowych procesorach dodano:
- – MMU (Memory Managment Unit) który zarządza „pamięcią wirtualną” – mapowaniem adresów wirtualnych w przestrzeni fizycznej
- – Tryb wirtualny 8086 tryb chroniony, w którym tryb rzeczywisty działa w rodzaju wirtualnej maszyny
- – Możliwość szybkiego przełączania między trybem chronionym i rzeczywistym, bez konieczności restartu procesora
80386 nadal opiera się na segmentowym modelu pamięci, ale jest procesorem 32 bitowym i może adresować liniowo do 4 GB pamięci, dając takie same udogodnienia jak przy płaski modelu pamięci.
EMM386.EXE, menedżer pamięci wprowadzony w MS-DOS 5 w 1991 roku, blokuje sam DOS do trybu wirtualnym 8086. Zapewnia również DOSowi korzystanie z EMS, wykorzystując rozszerzoną pamięć z trybu chronionego. Sterownik ten korzysta z MMU do mapowania bloków w EMS window. Przez to pamięć EMS jest szybsza niż XMS, ale wciąż jest niewygodna w użyciu.
EMM368 jest również w stanie załadować sterowniki urządzeń i programów rezydentnych do obszaru pamięci górnej, jeśli jest wystarczająco wolnych segmentów. Dzięki zastosowaniu LOADHIGH i DEVICEHIGH dyrektyw w autoexec.bat i config.sys, zamiast ich starszych odpowiedników LOAD i DEVICE, możliwe jest uzyskanie cennych kilkunastu kB z pamięci konwencjonalnej!
DOS nadal żywy
EMS, XMS i sposoby powiększania pamięci konwencjonalnej powodowały wzrost możliwości PC a co więcej, coraz jego większy udział na rynku gier. Pamiętajmy, że nawet procesor 80386 nie spowodował pozbycia się segmentacji pamięci a korzystanie z EMS i XMS było procesem powolnym.
Użytkownicy Amigi nadal mieli mocne argumenty na korzyść swoich systemów… do czasu pojawienia się DOS Extendera a jedną z pierwszych gier wykorzystującą nową technologię był… DOOM!
DOS Extender rozszerza DOS tak, żeby programy działające w trybie chronionym mogły bez modyfikacji wywoływać API MS-DOS. DOS intensywnie używa przerwań do komunikacji między systemem i oprogramowaniem użytkowym, ekstendery przechwytują wiele z podstawowych przerwań sprzętowych i programowych. Mówiąc w skrócie, DOS ekstender to miniaturowy system operacyjny, zastępujący dużą część głównego systemu operacyjnego. Z 32 bitowym DOS Extender, 386 jest w stanie uruchomić prawdziwe 32-bitowe programy i obsługiwać olbrzymie bloki pamięci! Aplikacje zbudowane na DOS Extender wymagają znacznie mniej wolnego pamięci konwencjonalnej i łagodzą bolesny proces konfigurowania własnego autoexec.bat i config.sys w celu uruchomienia ulubione gry. Wreszcie komputery PC mogą korzystać z szybkich procesorów i dużych ilości pamięci!
Różne wersje ekstenderów
– DOS/4G and DOS/4GW i DOS/16M producenta Tenberry Software, Inc.
– 286|DOS Extender i 386|DOS Extender producenta Phar Lap
– PROT napisany przez Ala Williamsa, 32-bitowy DOS extender opublikowany w Dr. Dobb’s Journal. Cechował się tym, że funkcje DOS i BIOS były emulowane przez ekstender, bez przełączania do trybu rzeczywistego.
– PMODE i PMODE/W Thomasa Pytela i Charlesa Sheffolda. PMODE/W, napisany dla Watcom C jako alternatywę dla DOS/4GW, stał się popularny wśród programistów demosceny.
– ekstendery OS/286 i OS/386 producenta Ergo (dawniej Eclipse, jeszcze dawniej A.I. Architects), jak również serwery DPM16 i DPM32
– Microsoft Windows (wersje oparta o DOS) zawierały zarówno serwer DPMI jak i DOS ekstender
– HX DOS Extender udostępnia ograniczone wsparcie Win32
– DosWin32 udostępnia ograniczone wsparcie Win32
– CWSDPMI Charlesa W. Sandmanna, serwer DPMI dla 32-bitowych programów trybu chronionego pisanych dla DJGPP
– GO32, używany w starszych wersjach DJGPP i przez Free Pascal
– DBOS producenta Salford Software, 32-bitowy DOS ekstender, używany głównie przez ich kompilator fortrana FTN77
– DOS/32 napisany przez Narech K, jako alternatywa dla DOS/4GW
Linki