Linia A20 - A20 line

Obszar wysokiej pamięci jest dostępny tylko w trybie rzeczywistym na procesorach 80286, jeśli włączona jest bramka A20.

A20 lub adres linii 20 , jest jednym z elektrycznych linii, które tworzą magistralę systemową danego x86 opartym na systemie komputerowym. W szczególności linia A20 jest używana do przesyłania 21 bitu na szynie adresowej .

Mikroprocesor zazwyczaj ma liczbę linii adresowych równą logarytmowi dwójkowemu jego fizycznej przestrzeni adresowej . Na przykład procesor z 4 GB adresowalnej przestrzeni fizycznej bajtowej wymaga 32 wierszy, które są nazwane od A0 do A31. Wiersze są nazwane po liczonej od zera liczbie bitu w adresie, który transmitują. Najmniej znaczący bit jest pierwszy, a zatem jest ponumerowane bitu 0 i sygnalizowane na linii A0. A20 przesyła bit 20 (bit 21) i staje się aktywny, gdy adresy osiągną 1 MB, czyli 2 20 .

Przegląd

The Intel 8086 , Intel 8088 i Intel 80186 procesory miały 20 linii adresowych, ponumerowane A0 do A19; dzięki temu procesor może uzyskać dostęp do 2 20 bajtów lub 1 MB. Rejestry adresów wewnętrznych takich procesorów miały tylko 16 bitów. Aby uzyskać dostęp do 20-bitowej przestrzeni adresowej, odwołanie do pamięci zewnętrznej składało się z 16-bitowego przesunięcia adresu dodanego do 16-bitowego numeru segmentu , przesuniętego o 4 bity, aby uzyskać 20-bitowy adres fizyczny. Wynikowy adres jest równy segmentowi × 16 + offset . Istnieje wiele kombinacji segmentu i przesunięcia, które dają ten sam 20-bitowy adres fizyczny. Dlatego istniały różne sposoby adresowania tego samego bajtu w pamięci. Na przykład, oto cztery z 4096 różnych kombinacji segment:przesunięcie, wszystkie odnoszą się do bajtu, którego adres fizyczny to 0x000FFFFF (ostatni bajt w przestrzeni pamięci 1 MB):

F000:FFFF
FFFF: 000F
F555:AAAF
F800:7FFF

W odniesieniu do ostatniego sposobu, zwiększenie przesunięcia o jeden daje F800:8000, który jest właściwym adresem dla procesora, ale ponieważ przekłada się na adres fizyczny 0x00100000 (pierwszy bajt ponad 1 MB), procesor potrzebowałby innego adresu wiersz dla rzeczywistego dostępu do tego bajtu. Ponieważ nie ma takiej linii na linii procesorów 8086, 21 bit powyżej, gdy jest ustawiony, jest usuwany, powodując „zawijanie” adresu F800:8000 i faktyczne wskazywanie adresu fizycznego 0x00000000.

Kiedy IBM zaprojektował maszynę IBM PC AT (1984), zdecydował się na użycie nowego, wydajniejszego mikroprocesora Intel 80286 . 80286 może adresować do 16 MB pamięci systemowej w trybie chronionym . Jednak procesor miał emulować zachowanie 8086 w trybie rzeczywistym, w trybie uruchamiania, tak aby mógł uruchamiać systemy operacyjne i programy, które nie zostały napisane dla trybu chronionego. Jednak 80286 nie wymusił zerowania linii A20 w trybie rzeczywistym. Dlatego kombinacja F800:8000 nie będzie już wskazywać na adres fizyczny 0x00000000, ale na adres 0x0010000. W rezultacie programy polegające na zawijaniu adresów przestałyby działać. Aby zachować kompatybilność z takimi programami, IBM postanowił naprawić problem na płycie głównej .

Udało się to osiągnąć poprzez umieszczenie bramki logicznej na linii A20 między procesorem a magistralą systemową, która została nazwana Gate-A20 . Gate-A20 może być włączany lub wyłączany przez oprogramowanie, aby umożliwić lub uniemożliwić odbieranie przez magistralę adresową sygnału z A20. Jest ustawiony na nieprzepuszczanie dla wykonywania starszych programów, które polegają na zawijaniu. Podczas uruchamiania BIOS najpierw włącza Gate-A20, gdy zlicza i testuje całą pamięć systemową, a następnie wyłącza ją przed przekazaniem sterowania do systemu operacyjnego.

Pierwotnie brama logiczna była bramą podłączoną do kontrolera klawiatury Intel 8042 . Kontrolowanie tego było stosunkowo powolnym procesem. Od tego czasu dodano inne metody, aby umożliwić bardziej wydajną wielozadaniowość programów, które wymagają tego otoczenia z programami, które uzyskują dostęp do całej pamięci systemowej. Istnieje wiele metod sterowania linią A20.

Odłączenie A20 nie spowodowałoby zawinięcia wszystkich dostępów do pamięci powyżej 1 MB, tylko tych w zakresach 1–2 MB, 3-4 MB, 5–6 MB itd. Oprogramowanie działające w trybie rzeczywistym dbało tylko o obszar nieco powyżej 1 MB, więc linia Gate-A20 wystarczyła.

Włączenie linii Gate-A20 jest jednym z pierwszych kroków, jakie wykonuje system operacyjny x86 w trybie chronionym w procesie uruchamiania, często przed przekazaniem kontroli do jądra z poziomu ładowania początkowego (na przykład w przypadku Linuksa).

Tryb Virtual 8086 , wprowadzony wraz z procesorem Intel 80386 , umożliwia symulację zawinięcia A20 przy użyciu funkcji pamięci wirtualnej procesora; pamięć fizyczna może być mapowana na wiele adresów wirtualnych. W ten sposób pamięć mapowana na pierwszym megabacie pamięci wirtualnej może być ponownie mapowana na drugim megabacie pamięci wirtualnej. System operacyjny może przechwytywać zmiany w Bramce A20 i wprowadzać odpowiednie zmiany w przestrzeni adresowej pamięci wirtualnej, co również sprawia, że ​​nie ma znaczenia wydajność przełączania linii Bramki A20.

Brama A20

Sterowanie linią A20 było ważną funkcją na pewnym etapie rozwoju architektury IBM PC, ponieważ zapewniało dostęp do dodatkowych 65 520 bajtów (64 KB - 16 bajtów) pamięci w trybie rzeczywistym , bez znaczących zmian oprogramowania.

W czymś, co było prawdopodobnie „hackiem”, bramka A20 była pierwotnie częścią kontrolera klawiatury na płycie głównej, która mogła ją otwierać lub zamykać w zależności od pożądanego zachowania.

Brama A20 jest nadal obecna na wielu nowoczesnych komputerach, a brama jest początkowo zamykana zaraz po uruchomieniu. Nowoczesne systemy operacyjne w trybie chronionym zazwyczaj otwierają bramkę A20 na początku procesu rozruchu i nigdy więcej jej nie zamykają. Takie systemy operacyjne nie mają powodów związanych z kompatybilnością, aby je zamykać, a otwierając je, uzyskują dostęp do pełnego zakresu adresów fizycznych.

Intel 80486 i Pentium dodany specjalny pin nazwie A20M # , który po podejrzewanym małe siły ugryzł 20 adresu fizycznego wynosi zero dla wszystkich cache- wbudowanej pamięci lub zewnętrznych dostępów. Było to konieczne, ponieważ 80486 wprowadził pamięć podręczną na chipie, więc maskowanie tego bitu w logice zewnętrznej nie było już możliwe. Oprogramowanie nadal musi manipulować bramą i nadal musi zajmować się zewnętrznymi urządzeniami peryferyjnymi ( chipset ) w tym celu.

Zmieniono obsługę bramki A20 w mikroarchitekturze Nehalem (niektóre źródła błędnie twierdzą, że usunięto obsługę A20). Zamiast tego, że CPU ma dedykowany pin A20M#, który odbiera sygnał, czy ma maskować bit A20, czy nie, został on zwirtualizowany tak, że informacja jest wysyłana ze sprzętu peryferyjnego do CPU przy użyciu specjalnych cykli magistrali. Z punktu widzenia oprogramowania mechanizm działa dokładnie tak jak poprzednio, a system operacyjny musi nadal zaprogramować zewnętrzny sprzęt (który z kolei wysyła wspomniane cykle magistrali do procesora), aby wyłączyć maskowanie A20.

Intel nie obsługuje już bramy A20, zaczynając od Haswella . Strona 271 podręcznika programistów systemu Intel, tom. 3A z czerwca 2013 stwierdza: „Funkcjonalność A20M# jest używana głównie przez starsze systemy operacyjne i nie jest używana przez nowoczesne systemy operacyjne. W nowszych procesorach Intel 64 A20M# może być nieobecny”.

Uchwyt A20

Program obsługi A20 to oprogramowanie menedżera pamięci IBM PC , które kontroluje dostęp do obszaru wysokiej pamięci (HMA). Menedżery rozszerzonej pamięci zwykle zapewniają tę funkcjonalność. Moduły obsługi A20 są nazwane po 21. linii adresowej mikroprocesora, linii A20.

W DOS menedżerowie HMA, tacy jak HIMEM.SYS, mają „dodatkowe zadanie” zarządzania A20. HIMEM.SYS dostarczył API do otwierania/zamykania A20. Sam DOS mógłby wykorzystać ten obszar do niektórych potrzeb związanych z przechowywaniem, zwalniając w ten sposób więcej konwencjonalnej pamięci dla programów. Ta funkcjonalność została włączona przez dyrektywy DOS=HIGHlub HIDOS=ONw pliku konfiguracyjnym CONFIG.SYS .

Programy, których dotyczy problem

Od 1980 roku zawijanie adresów było wewnętrznie używane przez 86-DOS i MS-DOS do implementacji punktu wejścia CALL 5 w stylu CP/M w prefiksie segmentu programu (PSP) (który częściowo przypomina stronę zerową CP/M ). Było to w szczególności, wykorzystywane przez programy maszyny translacji z CP / M-80 przez tłumaczy języka montaż jak Seattle Computer Products ' TRANS86 . Procedura obsługi CALL 5, do której odnosi się ten punkt wejścia, znajduje się pod adresem fizycznym 0x000000C0 (nakładając się na wpis dla przerwania INT 30h i pierwszy bajt przerwania INT 31h w tablicy wektorów przerwań trybu rzeczywistego ). Jednak w projekcie CP/M-80 16-bitowy adres docelowy 8080 / Z80 przechowywany pod offsetem 6 na stronie zerowej może być również celowo interpretowany jako rozmiar pamięci segmentu. Aby emulować to w systemie DOS z jego schematem adresowania segment:offset 8086, 16-bitowy offset punktu wejścia dalekiego wywołania musiał pasować do tego rozmiaru segmentu (np. 0xFEF0), który jest przechowywany pod offsetem 6 w PSP, zachodząc na części WYWOŁANIE 5. Jedynym sposobem na pogodzenie tych wymagań było wybranie wartości segmentu, która po dodaniu do 0xFEF0 daje w wyniku adres 0x001000C0, który w 8086 zawija się do 0x000000C0.

A20 musiał zostać wyłączony, aby zawinięcie wystąpiło i programy DOS korzystające z tego interfejsu działały. Nowsze wersje DOS, które mogą przenosić części siebie do HMA, zwykle tworzą kopię punktu wejścia w FFFF:00D0 w HMA (co ponownie zamienia się na fizyczne 0x001000C0), aby interfejs mógł działać bez względu na stan A20 .

Jednym z programów znanych z używania interfejsu CALL 5 jest DOSowa wersja kompilatora Small-C . Również narzędzie SPELL w Microsoft Word 3.0 (1987) jest jednym z programów zależnie od interfejsu CALL 5, który należy odpowiednio skonfigurować. Sun Microsystems ' PC-NFS (1993) wymaga CALL 5 fix-up, jak również.

Ponadto, aby zaoszczędzić miejsce na program, niektórzy programiści BIOS i DOS zastosowali sztuczkę , na przykład, aby mieć jeden segment, który ma dostęp do danych programu (na przykład od F800:0000 do F800:7FFF, wskazując na fizyczne adresy 0x000F8000– 0x000FFFFF), a także dane I/O (takie jak bufor klawiatury), które znajdowały się w pierwszym segmencie pamięci (z adresami F800:8000 do F800:FFFF wskazującymi na adresy fizyczne od 0x00000000 do 0x00007FFF).

Ta sztuczka działa tak długo, jak długo kod nie jest wykonywany w małej ilości pamięci , pierwszych 64 KB pamięci RAM, co zawsze było prawdziwe w starszych wersjach DOS bez możliwości dużego obciążenia.

Wraz z przeniesieniem jądra DOS do obszarów o wyższej pamięci, coraz mniej pamięci stawało się dostępne dla programów, co powodowało awarię tych zależnych od zawinięcia. Wykonywalne programy ładujące w nowszych wersjach DOS próbują wykryć niektóre popularne typy programów, których dotyczy problem, i albo na bieżąco je łatać, aby działały również przy małej ilości pamięci, albo ładować je powyżej pierwszych 64 KB przed przekazaniem do nich wykonania. W przypadku programów, które nie są wykrywane automatycznie, można użyć LOADFIX lub MEMMAX  -L do wymuszenia załadowania programów powyżej pierwszych 64 KB.

Sztuczka została wykorzystana przez sam IBM/Microsoft Pascal , a także przez skompilowane z nim programy, w tym Microsoft MASM . Innymi powszechnie używanymi narzędziami programistycznymi, które to wykorzystywały, były wykonywalne kompresory, takie jak Realia Spacemaker (napisany przez Roberta BK Dewara w 1982 roku i używany do kompresji wczesnych wersji Norton Utilities ) oraz EXEPACK Microsoftu (napisany przez Reubena Bormana w 1985 roku), a także odpowiednik /E Opcja [XEPACK] w Microsoft LINK 3.02 i nowszych. Programy przetwarzane za pomocą EXEPACK będą wyświetlać komunikat o błędzie „Pakiet spakowany jest uszkodzony”.

Istnieją różne narzędzia innych firm, które modyfikują skompresowane pliki wykonywalne, zastępując problematyczne procedury dekompresji lub próbując rozwinąć i przywrócić oryginalny plik.

Nowoczesne programy ładujące Legacy BIOS (takie jak GNU GRUB ) używają linii A20. Programy ładujące UEFI korzystają z 32-bitowego trybu chronionego lub 64-bitowego trybu długiego .

Zobacz też

Bibliografia

Dalsza lektura