Zarządzanie pamięcią DOS
W komputerach zgodnych z IBM PC zarządzanie pamięcią DOS odnosi się do oprogramowania i technik stosowanych w celu zapewnienia aplikacjom dostępu do ponad 640 kibibajtów (640*1024 bajtów) (KiB) „pamięci konwencjonalnej”. Limit 640 KiB był specyficzny dla IBM PC i bliskich kompatybilności; inne maszyny z systemem MS-DOS miały inne ograniczenia, na przykład komputer Apricot mógł mieć do 768 KiB, a Sirius Victor 9000, 896 KiB. Zarządzanie pamięcią w rodzinie IBM było skomplikowane ze względu na konieczność zachowania zgodności wstecznej z oryginalnym projektem komputera PC i systemem DOS w trybie rzeczywistym , jednocześnie umożliwiając użytkownikom komputerów korzystanie z dużych ilości niedrogiej pamięci i nowych generacji procesorów. Ponieważ DOS ustąpił miejsca systemowi Microsoft Windows i innym 32-bitowym systemom operacyjnym, które nie były ograniczone pierwotnym arbitralnym limitem 640 KiB komputera IBM PC, zarządzanie pamięcią komputera osobistego nie wymaga już od użytkownika ręcznej manipulacji wewnętrznymi ustawieniami i parametrami system.
Limit 640 KiB nałożył dużą złożoność na sprzęt i oprogramowanie mające na celu jego obejście; pamięć fizyczna w maszynie może być zorganizowana jako kombinacja pamięci podstawowej lub konwencjonalnej (w tym pamięci dolnej), pamięci górnej, pamięci wysokiej (nie to samo co pamięć górna), pamięci rozszerzonej i pamięci rozszerzonej, z których wszystkie są obsługiwane na różne sposoby.
Pamięć konwencjonalna
Procesor Intel 8088 używany w oryginalnym IBM PC miał 20 linii adresowych, więc mógł bezpośrednio zaadresować 1 MiB (220 bajtów ) pamięci. Różne obszary tej przestrzeni adresowej zostały przydzielone różnym rodzajom pamięci używanej do różnych celów. Zaczynając od najniższego końca przestrzeni adresowej, komputer PC miał zainstalowaną pamięć o dostępie swobodnym (RAM) do odczytu/zapisu, która była używana przez DOS i programy użytkowe. Pierwsza część tej pamięci była instalowana na płycie głównej systemu (w bardzo wczesnych maszynach 64 KiB, później poprawiona do 256 KiB). Dodatkową pamięć można dodać za pomocą kart podłączonych do gniazd rozszerzeń; każda karta zawierała paski lub przełączniki kontrolujące, jaka część przestrzeni adresowej ma dostęp do pamięci i urządzeń na tej karcie.
Na komputerze IBM PC cała przestrzeń adresowa do 640 KiB była dostępna dla pamięci RAM. Ta część przestrzeni adresowej nazywana jest „pamięcią konwencjonalną”, ponieważ jest dostępna dla wszystkich wersji DOS automatycznie podczas uruchamiania. Segment 0, pierwsze 64 KiB pamięci konwencjonalnej, jest również nazywany obszarem małej ilości pamięci . Zwykle pamięć rozszerzająca jest ustawiona jako ciągła w przestrzeni adresowej z pamięcią na płycie głównej. Gdyby istniała nieprzydzielona luka między pamięcią płyty głównej a pamięcią rozszerzenia, pamięć nie byłaby automatycznie wykrywana jako użyteczna przez system DOS.
Górny obszar pamięci
Górny obszar pamięci (UMA) odnosi się do przestrzeni adresowej między 640 KiB a 1024 KiB (0xA0000–0xFFFFF). Region 128 KiB między 0xA0000 a 0xBFFFF był zarezerwowany dla VGA i starszego SMM. Region 128 KiB między 0xC0000 a 0xDFFFF był zarezerwowany dla Option ROM urządzeń , w tym Video BIOS . 64 KiB przestrzeni adresowej od 0xE0000 do 0xEFFFF było zarezerwowane dla BIOS -u lub opcjonalnej pamięci ROM . IBM PC zarezerwował najwyższe 64 KiB przestrzeni adresowej od 0xF0000 do 0xFFFFF dla systemu BIOS i pamięci tylko do odczytu (ROM) Cassette BASIC .
Na przykład obszar pamięci monochromatycznej karty wideo wynosił od 704 do 736 KiB (0xB0000–0xB7FFF). Gdyby użyto tylko monochromatycznej karty graficznej, przestrzeń adresowa między 0xA0000 a 0xAFFFF mogłaby zostać wykorzystana dla pamięci RAM, która byłaby ciągła z pamięcią konwencjonalną.
Pamięci ROM systemu BIOS muszą znajdować się na górnym końcu przestrzeni adresowej, ponieważ adres początkowy procesora jest ustalany przez konstrukcję procesora. Adres początkowy jest ładowany do licznika programu CPU po resecie sprzętowym i musi mieć zdefiniowaną wartość, która utrzymuje się po przerwaniu zasilania systemu. Po zresetowaniu lub włączeniu procesor ładuje adres z systemowej pamięci ROM, a następnie przeskakuje do określonej lokalizacji w pamięci ROM autotestu systemu po włączeniu zasilania i ostatecznie załadować system operacyjny.
Ponieważ karta rozszerzeń, taka jak karta wideo, kontroler dysku twardego lub karta sieciowa, może wykorzystywać przydziały pamięci w wielu wyższych obszarach pamięci, konfiguracja niektórych kombinacji kart wymagała uważnego przeczytania dokumentacji lub eksperymentowania w celu znalezienia ustawień karty i mapowania pamięci , które działały. Mapowanie dwóch urządzeń w celu korzystania z tych samych adresów pamięci fizycznej może spowodować zablokowanie lub niestabilność systemu. Nie wszystkie adresy w górnym obszarze pamięci były używane w typowym systemie; nieużywane adresy fizyczne zwróciłyby niezdefiniowane i zależne od systemu dane, gdyby procesor uzyskał do nich dostęp.
Rozszerzona pamięć
Wraz ze spadkiem cen pamięci programy użytkowe, takie jak arkusze kalkulacyjne i wspomagane komputerowo kreślenie, zostały zmienione, aby wykorzystać coraz więcej pamięci fizycznej w systemie. Pamięć wirtualna w 8088 i 8086 nie była obsługiwana przez sprzęt procesora, a ówczesna technologia dyskowa czyniłaby ją zbyt wolną i uciążliwą, aby była praktyczna. Rozszerzona pamięć była systemem, który umożliwiał aplikacjom dostęp do większej ilości pamięci RAM niż bezpośrednio widocznej dla przestrzeni adresowej procesora. Proces ten był formą zmiany banku . Gdy potrzebna była dodatkowa pamięć RAM, sterownika tymczasowo udostępniało procesorowi część rozszerzonej pamięci; kiedy dane w tym fragmencie pamięci zostały zaktualizowane, inna część mogła zostać zamieniona w przestrzeń adresową procesora. W przypadku komputerów IBM PC i IBM PC/XT , z zaledwie 20 liniami adresowymi, wykonano specjalne karty rozszerzonej pamięci, zawierające być może megabajt lub więcej rozszerzonej pamięci, z logiką na płycie, aby ta pamięć była dostępna dla procesora w zdefiniowane części przestrzeni adresowej 8088.
Alokacja i wykorzystanie rozszerzonej pamięci nie było przejrzyste dla programów użytkowych. Aplikacja musiała śledzić, który bank rozszerzonej pamięci zawierał określony fragment danych, a kiedy wymagany był dostęp do tych danych, aplikacja musiała zażądać (za pośrednictwem programu sterownika) karty rozszerzonej pamięci, aby zmapować tę część pamięci do przestrzeń adresową procesora. Chociaż aplikacje mogły korzystać z pamięci rozszerzonej ze względną swobodą, wiele innych składników oprogramowania, takich jak sterowniki i programy rezydentne typu „zakończ i pozostań” (TSR), nadal było zwykle ograniczone do rezydowania w obszarze „pamięci konwencjonalnej” o pojemności 640 KB, który wkrótce stał się krytycznie rzadkim ratunek.
80286 i wysoki obszar pamięci
Kiedy wprowadzono IBM PC / AT , segmentowana architektura pamięci procesorów z rodziny Intel miała produkt uboczny polegający na umożliwieniu adresowania nieco więcej niż 1 MiB pamięci w trybie „rzeczywistym”. Ponieważ 80286 miał więcej niż 20 linii adresowych, pewne kombinacje segmentu i przesunięcia mogły wskazywać na pamięć powyżej lokalizacji 0x0100000 (2 20 ). 80286 mógł zaadresować do 16 MiB pamięci systemowej, eliminując w ten sposób zachowanie adresów pamięci „zawijających się”. Ponieważ wymagana linia adresu już istniała, kombinacja F800:8000 nie wskazywałaby już na adres fizyczny 0x0000000, ale na poprawny adres 0x00100000.
W rezultacie niektóre programy DOS przestały działać. Aby zachować kompatybilność z zachowaniem PC i XT, AT zawierał liniową A20 (Gate A20), która sprawiała, że adresy pamięci w AT zawijały się do małej ilości pamięci, tak jak w przypadku procesora 8088. Tą bramą można było sterować, początkowo za pomocą kontrolera klawiatury , aby umożliwić uruchomionym programom zaprojektowanym do tego celu dostęp do dodatkowych 65 520 bajtów (64 KiB pamięci w trybie rzeczywistym ). Podczas uruchamiania systemu BIOS najpierw włącza A20 podczas liczenia i testowania wszystkich pamięci systemowej i wyłącza ją przed przekazaniem kontroli do systemu operacyjnego Włączenie linii A20 jest jednym z pierwszych kroków, które system operacyjny x86 w trybie chronionym wykonuje w procesie uruchamiania, często przed przekazaniem kontroli do jądra z ładowania początkowego (na przykład w przypadku Linuksa).
wysokiej pamięci ( HMA ) to obszar pamięci RAM składający się z pierwszych 64 KiB, minus 16 bajtów , rozszerzonej pamięci komputera IBM PC/AT lub kompatybilnego mikrokomputera.
Pierwotnie bramka logiczna była bramką podłączoną do kontrolera klawiatury Intel 8042 . Kontrolowanie go było stosunkowo powolnym procesem. Od tego czasu dodano inne metody, aby umożliwić bardziej wydajną wielozadaniowość programów, które wymagają tego zawijania z programami uzyskującymi dostęp do całej pamięci systemowej. Początkowo istniało wiele metod, ale ostatecznie branża zdecydowała się na metodę PS/2 polegającą na wykorzystaniu bitu w porcie 92h do sterowania linią A20.
Odłączenie A20 nie obejmowałoby wszystkich dostępów do pamięci powyżej 1 MiB, tylko te z zakresów 1 MiB, 3 MiB, 5 MiB itd. Oprogramowanie w trybie rzeczywistym dbało tylko o obszar nieco powyżej 1 MiB, więc wystarczyła bramka A20.
Tryb Virtual 8086 , wprowadzony wraz z układem Intel 80386 , umożliwia symulację zawijania A20 przy użyciu funkcji pamięci wirtualnej procesora: pamięć fizyczna może być mapowana na wiele adresów wirtualnych, co pozwala na mapowanie pamięci na pierwszy megabajt pamięć wirtualna może zostać ponownie zmapowana w drugim megabajcie pamięci wirtualnej. System operacyjny może przechwycić zmiany w bramce A20 i dokonać odpowiednich zmian w przestrzeni adresowej pamięci wirtualnej, co również powoduje, że wydajność przełączania bramki A20 nie ma znaczenia.
Pierwszym użytkownikiem HMA wśród produktów firmy Microsoft był Windows 2.0 w 1987 roku, który wprowadził sterownik urządzenia HIMEM.SYS . Począwszy od wersji 5.0 DR-DOS (1990) i MS-DOS (1991), części systemu operacyjnego można było również ładować do HMA, zwalniając do 46 KiB konwencjonalnej pamięci . Inne komponenty, takie jak sterowniki urządzeń i TSR, mogą być ładowane do górnego obszaru pamięci (UMA).
Handlarz A20
Program obsługi A20 to oprogramowanie kontrolujące dostęp do obszaru wysokiej pamięci. Rozszerzone menedżery pamięci zwykle zapewniają tę funkcjonalność. W systemie DOS menedżerowie obszarów o dużej pamięci, tacy jak HIMEM.SYS , mieli dodatkowe zadanie zarządzania A20 i udostępniali interfejs API do otwierania/zamykania A20. Sam DOS mógłby wykorzystać ten obszar do niektórych swoich potrzeb w zakresie przechowywania, uwalniając w ten sposób więcej konwencjonalnej pamięci dla programów. Ta funkcja została włączona przez dyrektywę „ DOS = HIGH” w pliku konfiguracyjnym CONFIG.SYS .
Bramka A20 w późniejszych procesorach
Intel 80486 i Pentium dodały specjalny pin o nazwie A20M # , który po stwierdzeniu niskiego wymusza ustawienie bitu 20 adresu fizycznego na zero dla wszystkich wejść do pamięci podręcznej na chipie lub pamięci zewnętrznej. Było to konieczne, ponieważ 80486 wprowadził pamięć podręczną na chipie, a zatem maskowanie tego bitu w zewnętrznej logice nie było już możliwe. Oprogramowanie nadal musi manipulować bramką i nadal musi radzić sobie z zewnętrznymi urządzeniami peryferyjnymi (chipsetem ) .
80386 i kolejne procesory
Procesory Intela począwszy od 386 umożliwiały wirtualny tryb 8086 , który upraszczał sprzęt wymagany do implementacji rozszerzonej pamięci dla aplikacji DOS. Rozszerzone menedżery pamięci, takie jak QEMM firmy Quarterdeck i EMM386 firmy Microsoft, obsługiwały standard rozszerzonej pamięci bez wymogu stosowania specjalnych kart pamięci.
W procesorach 386 i kolejnych menedżery pamięci, takie jak QEMM, mogą przenieść większość kodu sterownika lub TSR do pamięci rozszerzonej i zastąpić go małym uchwytem, który był w stanie uzyskać dostęp do kodu rezydenta pamięci rozszerzonej. Mogą analizować użycie pamięci w celu wykrycia sterowników, które wymagały więcej pamięci RAM podczas uruchamiania niż później, oraz odzyskiwać i ponownie wykorzystywać pamięć, która nie była już potrzebna po uruchomieniu. Mogą nawet ponownie mapować obszary pamięci normalnie używane do operacji we/wy mapowanych w pamięci. Wiele z tych sztuczek opierało się na założeniach dotyczących działania sterowników i innych komponentów. W efekcie menedżerowie pamięci mogą na bieżąco dokonywać inżynierii wstecznej i modyfikować kod innych dostawców. Jak można się było spodziewać, takie sztuczki nie zawsze działały. Dlatego menedżerowie pamięci zawierali również bardzo rozbudowane systemy konfigurowalnych opcji i możliwości odzyskiwania, gdyby wybrana opcja uniemożliwiła uruchomienie komputera (częste zjawisko).
Instalowanie i konfigurowanie menedżera pamięci może wymagać wielu godzin eksperymentowania z opcjami, wielokrotnego ponownego uruchamiania komputera i testowania wyników. Jednak pamięć konwencjonalna była tak cenna, że właściciele komputerów PC uważali, że taki czas był dobrze wykorzystany, jeśli w rezultacie zwolniono 30 KiB lub 40 KiB konwencjonalnej pamięci.
Rozszerzona pamięć
W kontekście komputerów kompatybilnych z IBM PC pamięć rozszerzona odnosi się do pamięci w przestrzeni adresowej 80286 i kolejnych procesorów, poza limitem 1 megabajta narzuconym przez 20 linii adresowych 8088 i 8086. Taka pamięć nie jest bezpośrednio dostępna dla DOS aplikacje działające w tzw. „trybie rzeczywistym” procesorów 80286 i kolejnych. Ta pamięć jest dostępna tylko w trybie chronionym lub wirtualnym procesorów 80286 i wyższych.
Zobacz też
- Globalna specyfikacja importu EMM (GEMMIS)
- Wirtualne usługi DMA (VDS)
- Wirtualny interfejs programu sterującego (VCPI)
- Rozszerzony wirtualny interfejs programu sterującego (XVCPI)
- Interfejs trybu chronionego DOS (DPMI)
- Usługi trybu chronionego DOS (DPMS)
- Maskowanie helisy
Linki zewnętrzne
- Pomoc techniczna firmy Microsoft: omówienie funkcji zarządzania pamięcią w systemie MS-DOS
- Kroniki komputerowe (1990). „ Wysokie zarządzanie pamięcią ”. Z archiwum internetowego .