Tryb rzeczywisty to tryb pracy mikroprocesorów z rodziny procesorów x86, w którym procesor pracuje tak jak procesor Intel 8086.



Podobne dokumenty
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

Układ sterowania, magistrale i organizacja pamięci. Dariusz Chaberski

Programowanie Niskopoziomowe

Mikroinformatyka. Wielozadaniowość

ARCHITEKTURA PROCESORA,

Procesory rodziny x86. Dariusz Chaberski

Architektura komputerów

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Mikroinformatyka. Tryb wirtualny

Programowanie w asemblerze Środowiska 64-bitowe

Wybrane zagadnienia elektroniki współczesnej

Organizacja typowego mikroprocesora

Sprzętowe wspomaganie pamięci wirtualnej

J. Ułasiewicz Komputerowe systemy sterowania 1. 1 Architektura PC Ogólna struktura systemu jednoprocesorowego

Mikroinformatyka. Mechanizmy ochrony pamięci

3 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK SP.06 Rok akad. 2011/ / 22

System operacyjny MS-DOS

Zarządzanie pamięcią w systemie operacyjnym

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

Architektura systemu komputerowego. Działanie systemu komputerowego. Przerwania. Obsługa przerwań (Interrupt Handling)

WOJSKOWA AKADEMIA TECHNICZNA

Adam Kotynia, Łukasz Kowalczyk

Zarządzanie zasobami pamięci

RDZEŃ x86 x86 rodzina architektur (modeli programowych) procesorów firmy Intel, należących do kategorii CISC, stosowana w komputerach PC,

Prezentacja systemu RTLinux

Architektura komputerów

Procesor budowa, schemat, tryby pracy

Programowanie niskopoziomowe

Schematy zarzadzania pamięcia

Działanie systemu operacyjnego

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Działanie systemu operacyjnego

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

architektura komputerów w. 8 Zarządzanie pamięcią

Komputery klasy PC. Dariusz Chaberski

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Ćwiczenie nr 4. Zasady kodowania podprogramów

Pośredniczy we współpracy pomiędzy procesorem a urządzeniem we/wy. W szczególności do jego zadań należy:

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

SYSTEMY OPERACYJNE WYKLAD 4 - zarządzanie pamięcią

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

Ćwiczenie 3. Konwersja liczb binarnych

Sygnały DRQ i DACK jednego kanału zostały użyte do połączenia kaskadowego obydwu sterowników.

Wykład 7. Zarządzanie pamięcią

Materiały do wykładu. 7.Architekturax86. Marcin Peczarski. Instytut Informatyki Uniwersytet Warszawski

Działanie systemu operacyjnego

PRZERWANIA. P1 - Procedura obslugi przerwania. Obsługa zdarzenia Z1 poprzez procedurę obsługi przerwania P1

Budowa systemów komputerowych

Zarządzanie pamięcią operacyjną

Architektura komputerów

Pamięć wirtualna. Przygotował: Ryszard Kijaka. Wykład 4

UTK ARCHITEKTURA PROCESORÓW 80386/ Budowa procesora Struktura wewnętrzna logiczna procesora 80386

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Działanie systemu operacyjnego

Programowanie Niskopoziomowe

Mikroprocesor Operacje wejścia / wyjścia

Metody obsługi zdarzeń

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

URZĄDZENIA WEJŚCIA-WYJŚCIA

dr inż. Jarosław Forenc

Technologia informacyjna. Urządzenia techniki komputerowej

LEKCJA TEMAT: Zasada działania komputera.

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

PRZERWANIA. 1. Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.

Architektura komputera typu PC z procesorem IA-32

Układ wykonawczy, instrukcje i adresowanie. Dariusz Chaberski

Wprowadzenie do informatyki i użytkowania komputerów. Kodowanie informacji System komputerowy

Bibliografia: pl.wikipedia.org Historia i rodzaje procesorów w firmy Intel

Architektura Systemów Komputerowych. Rozwój architektury komputerów klasy PC

Programowanie niskopoziomowe

Architektura komputerów. Asembler procesorów rodziny x86

Zaawansowane Architektury Procesorów Część 1

Sprzęt i architektura komputerów

Jądro systemu operacyjnego

PROGRAMOWANIE NISKOPOZIOMOWE

dr inż. Jarosław Forenc

1. Podstawy...P Polecenia podstawowe...p... 18

Zarządzanie pamięcią operacyjną

Zarządzanie pamięcią operacyjną zagadnienia podstawowe

(Rysunek z książki T.Starecki. Mikokontrolery jednoukładowe rodziny 51. NOZOMI W-wa 1996)

Architektura Systemów Komputerowych. Jednostka ALU Przestrzeń adresowa Tryby adresowania

002 Opcode Strony projektu:

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

Mikroprocesory rodziny INTEL 80x86

Architektura systemów komputerowych. dr Artur Bartoszewski

Q E M U.

PRZYDZIAŁ PAMIĘCI OPERACYJNEJ

Architektura i administracja systemów operacyjnych

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)

Architektura systemu komputerowego

Emulacja maszyny. Program udaje zupełnie inną architekturę. Musi przetłumaczyć instrukcje emulowane na instrukcje platformy, na której działa

Część I - Sterownik przerwań 8259A i zegar/licznik 8253

PAMIĘCI. Część 1. Przygotował: Ryszard Kijanka

Od programu źródłowego do procesu

Transkrypt:

T: Tryb rzeczywisty i chroniony procesora. Tryb rzeczywisty to tryb pracy mikroprocesorów z rodziny procesorów x86, w którym procesor pracuje tak jak procesor Intel 8086. W trybie tym brak ochrony pamięci przed użyciem przez inny proces i brak obsługi wielozadaniowości. W trybie rzeczywistym pracowały programy w systemie operacyjnym DOS, na przełomie lat 80 i 90 dwudziestego wieku prowadzono działania nad pracą programów w systemie DOS w trybie chronionym, pozostawiając sam system w trybie rzeczywistym, zbudowano kilka systemów umożliwiających taką pracę systemu. W trybie rzeczywistym dostępna jest 1-megabajtowa przestrzeń adresowa. Adres logiczny (programowy) składa się z dwóch liczb 16-bitowych: segmentu (numeru segmentu) oraz przemieszczenia względem początku segmentu (ang. offset). Adres fizyczny jest liczony jako segment * 16 + przemieszczenie. Ponieważ segmenty nie są rozłączne, wiele różnych adresów logicznych może odwoływać się do tej samej komórki pamięci (dokładnie - jeden adres fizyczny jest opisywany przez 4096 różnych adresów logicznych); na przykład: segment:offset = 0x1000:0xA000 adres fizyczny = 0x1000*16 + 0xA000 = 0x1A000 segment:offset = 0x1900:0x1000 adres fizyczny = 0x1900*16 + 0x1000 = 0x1A000 Ponieważ segment i przemieszczenie mają 16 bitów, dlatego w trybie rzeczywistym można maksymalnie zaadresować 1088 kb pamięci, ale procesory Intel 8086, 8088, 80188 oraz 80186 posiadają 20-bitową szynę adresową i z tego powodu mogą zaadresować tylko 1024 kb pamięci przy próbie sięgnięcia do adresu powyżej 1024 kb w rzeczywistości odwołają się do adresu o 1 MB niższego. Procesory nowsze, tzn. i286, i386 itd., mają szersze szyny adresowe (24-, 32- lub 36-bitowe) toteż pracując w trybie rzeczywistym mogą adresować całe 1088 kb pamięci. System DOS począwszy od wersji 4.0 potrafił wykorzystać te dodatkowe 65536-16 B pamięci, która została nazwana pamięcią wysoką (HMA High Memory Area). Jednak powoduje to niepełną zgodność z procesorami Intel 8086 i dlatego w komputerach zgodnych z IBM/PC została wprowadzona możliwość blokowania 21. linii adresowej nowszych procesorów, co sprawia, że programy pracujące w trybie rzeczywistym mają dostęp do 20 linii. Blokowanie i odblokowywanie linii 21 jest udostępniane przez ustawienie w biosie komputera bramkę A20 (ang. A20 gate; A20 to numer linii adresowej, liczony od 0). Tryb chroniony (ang. protected mode) to tryb pracy mikroprocesorów serii x86 wprowadzony w mikroprocesorze Intel 80286. Tryb chroniony umożliwia adresowanie pamięci w większym zakresie niż 1MB (tryb rzeczywisty), wprowadza wiele nowych udogodnień wspierających wielozadaniowość, takich jak: sprzętowa ochrona pamięci (układ MMU), wsparcie przełączania kontekstu procesora i wiele innych. Większość nowoczesnych systemów operacyjnych wykorzystuje procesory serii x86 właśnie w trybie chronionym. Zaliczają się do nich m.in.: Linux, Windows w wersji 3.0 i wyższych, systemy z rodziny BSD. Tryb chroniony został wprowadzony do mikroprocesora Intel 80286 wraz z trybem rzeczywistym (ang. real mode) dla zachowania zgodności z poprzednimi mikroprocesorami rodziny x86. W mikroprocesorze Intel 80286 w trybie chronionym 16-bitowe rejestry segmentowe CS, SS, DS, ES zawierają selektory, które jednoznacznie określają deskryptor (8-bajtowa struktura w pamięci) opisujący segment. Deskryptor dysponuje następującymi informacjami o segmencie: fizyczna lokalizacja segmentu w pamięci (24-bitowy adres bazowy, 16-bitowa długość segmentu w bajtach), prawa dostępu do segmentu i numer uprawnienia segmentu. W odróżnieniu od trybu chronionego w trybie rzeczywistym rejestry segmentowe CS, SS, DS, ES zawierają adresy bazowe (początków) segmentów. Procesor zaczyna pracę trybie chronionym po ustawieniu bitu PE (ang.

Protection Enable) na jeden, wyzerowanie tego bitu powoduje powrót do trybu rzeczywistego (bit PE to najmłodszy bit rejestru CR0 (ang. Control Register)). Tryb wirtualny (zwany także V86 lub Virtual 8086) specjalny tryb pracy procesorów o architekturze IA- 32, dostępny w trybie chronionym, który umożliwia uruchamianie programów przeznaczonych dla trybu rzeczywistego. W trybie wirtualnym symulowane jest działanie analogiczne dla procesora Intel 8086 (faktycznie można uruchamiać kod także dla 8088, 80186 i 80188), tzn. otrzymuje dostęp do 1 MB pamięci i rejestrów procesora i może wykonywać te rozkazy, które mają sens w takim otoczeniu. Natomiast w odróżnieniu od "prawdziwego" trybu rzeczywistego, wszelki dostęp do portów procesora jest sankcjonowany przez system operacyjny pracujący w tybie chronionym. Podobnie przerwania są obsługiwane przez system operacyjny. To umożliwia bezkonfliktową pracę zwykłych zadań systemu i zadań V86. Możliwe jest ponadto jednoczesne uruchmienie wielu zadań V86. Ponieważ to na system operacyjny spada obsługa dostępu do portów oraz przerwań, system musi emulować sprzęt, jak i udostępniać określoną funkcjonalność 16-bitowego systemu operacyjnego. Innymi słowy system musi tłumaczyć żądania zadania V86, np. zapis do określonego portu na akcję sterownika sprzętu. Tryb V86 jest wykorzystywany do uruchamiania programów DOS-owych. System Windows posiada wbudowane mechanizmy umożliwiające uruchomienie takich programów (w Windows NT jest to NTVDM), natomiast dla systemu Linux istnieje specjalny program dosemu. http://www.unit1.pl/258,txt Wyróżniamy dwa tryby procesora: tryb rzeczywisty (16 bitowy) i tryb chroniony (32 bitowy). Gdy włączamy kompa, to procesor uruchamia się w trybie rzeczywistym następnie uruchamia biosa (który właśnie jest 16Bitowy), a Bios następnie uruchamia boot loadera, a dopiero on uruchamia jądro systemu. A od systemu zależy czy pozostanie w trybie rzeczywistym czy przejdzie do trybu chronionego. Tryb rzeczywisty Jest od początku istnienia PC-ta, jak już wcześniej wspomniałem jest to tryb 16 bitowy. Przykładowy system to DOS. Pisanie systemu w tym trybie nie jest nawet takie trudne, dlatego że bios udostępnia bardzo wiele procedur, z których możemy korzystać, mniej więcej do obsługi karty graficznej, klawiatury, dysków itd. kto programował w asemblerze pod Dos-a to bardzo dobrze o tym wie. Przerwania w trybie rzeczywistym. Przerwania mogą być programowe lub sprzętowe. Programowe są wywoływane przez użytkownika, a sprzętowe przez sprzęt (zresztą jak sama nazwa wskazuje). A jak to działa? W bardzo prosty sposób, na samym początku pamięci (adres 0x0000:0x0000) znajduje się tablica wektorów przerwań, która została załadowana przez Bios. Tablica wektorów przerwań to po prostu tablica par offset:segment. Przerwań może być maksymalnie 256. A teraz jakiś konkretny przykład: Użytkownik wciska klawisz klawiatury wywołuje przerwanie sprzętowe o numerze 09h, procesor przerywa swoją dotychczasowa prace (stąd właśnie ta nazwa "przerwanie") Patrzy do tablicy wektorów przerwań gdzie znajduje się procedura obsługi przerwania i skacze do niej. W tym przypadku taka procedura ma za zadanie zapamiętać jaki klawisz został naciśnięty, po zakończeniu tej procedury, procesor wraca do zadania, które robił przed wywołaniem przerwania. I to jest cała filozofia. Na koniec jeszcze kilka wzorów na obliczenie gdzie w tablicy znajduje się zapisany Segment i Offset konkretnego przerwania: Segment = wartość przy 0x0000:numer_przerwania*4 Offset = wartość przy 0x0000:(numer_przerwania*4)+2

Znając to możemy przechwytywać przerwania i pisać własne procedury obsługi. Wykorzystywane jest to w bardzo w wielu celach np. do pisania wirusów czy do obsługi klawiatury w grach pod Dosa bo jak pewnie wielu zauważyło funkcja readkey nie jest do tego zbyt dobra. My przerwania będziemy wykorzystywać do komunikacji programu z systemem. Adresy Programując będziemy korzystać z adresów logicznych, a procesor automatycznie będzie go zmieniał na adres fizyczny. Czym się rożni adres logiczny od fizycznego opisuje poniżej: adres fizyczny - (physical address) jest adresem najniższego poziomu. Podczas komunikacji procesora z układem obsługującym pamięć, na jego liniach adresowych wystawiany jest właśnie adres fizyczny. Wykorzystujemy go podczas komunikowania się z dowolnymi urządzeniami. W trybie rzeczywistym adres fizyczny jest 20 bitowy. adres logiczny - (logical address) jest adresem złożonym z dwóch członów: identyfikatora segmentu i przemieszczenia w tym segmencie. Adres taki zapisujemy w postaci segment:offset. Adres logiczny powinien być wykorzystywany do zapisywania lub odczytywania danych, procesor automatycznie zamienia go na adres adres fizyczny. adres segmentowy - (segment) jest pierwszą częścią adresu logicznego. Jeżeli został podany bez offset'u oznacza to, że wskazuje nie konkretną komórkę pamięci a cały blok. adres relatywny - (offset) jest odległością od początku segmentu, lub jakiegoś bloku danych. Adres takiego segmentu musi być znany. Pamięć Niestety tryb rzeczywisty jest też bardzo ograniczony, mamy dostęp tylko do 1MB pamięci, która właściwie jest w części zajęta mniej więcej przez bios, więc nam zostaje tylko 640KB. Pamięć też jest podzielona na sektory po 64KB. A tak mniej więcej wygląda pamięć w trybie rzeczywistym: 0x0000:0x0000 - tablica wektorów przerwań 0x0000:0x7C00 - tu zostaje załadowany boot-sector przez BIOS 0x1000:0x0000-0x9000:0xFFFF - pamięć użytkownika (najlepiej używać z tego przedziału) 0xA000:0x0000 - pamięć video karty VGA (tylko dla trybu graficznego) 0xB000:0x0000 - pamięć video karty Hercules Monochrome 0xB800:0x0000 - pamięć trybu tekstowego karty VGA 0xC000:0x0000-0xF000:0xFFFF - pamięć BIOSu i inne Podstawowym ograniczeniem trybu rzeczywistego jest to, że procesor może wykorzystać jedynie niższe 20 bitów swojej magistrali adresowej, stąd właśnie to ograniczenie pamięci, o którym pisałem wcześniej. Niepraktyczne było tworzenie rejestrów 20 bitowych na przechowywanie adresów, więc projektanci INTELA podzielili przestrzeń adresowa na segmenty (po 64KB). Wiec do odwoływania się do pamięci używamy dwóch liczb 16 bitowych, pierwsza to adres segmentu druga to offset przesunięcia od początku segmentu. Adres fizyczny mając parę 16bitowych rejestrów(segment i offset) możemy obliczyć następująco: adres fizyczny = segment * 16 + offset Pamięć PC podzielona jest na 4 logiczne obszary: I. Conventional Memory - jest to pierwsze 640kb pamięci systemowej. Jest to obszar dostępny dla programisty. Adres : 0000h - 9FFFFh.

II. Upper Memory Area (UMA) - jest to wyższe 384 bajty pierwszego megabajta pamięci, bezpośrednio ponad pamięcią konwencjonalną. Jest ona zarezerwowana do użytku przez urządzenia systemowe oraz ROM razem ze sterownikami. Adres : A0000h - FFFFFh. III. High Memory Area (HMA) - pierwsze 64kb drugiego megabajta pamięci, czyli pierwsze 64kb pamięci rozszerzonej, która może być dostępna w trybie rzeczywistym. Adres: 100000h - 10FFEFh. IV. Extended Memory (pamięć rozszerzona) - jest to cała pamięć powyżej pierwszego megabajta. Dostęp do niej mamy jedynie w trybie chronionym. Adres 10FFF0h do końca pamięci operacyjnej. Ze względu na błąd zrobiony przez firmę Intel możemy skorzystać jeszcze z 64KB, które znajdują się ponad tym 1MB jest to tak zwana pamięć HMA (high memory area). HMA to pierwsze 65,520 bajtów (64kb odjąć 16 bajtów) pamięci rozszerzonej (tej powyżej granicy 1mb). Technicznie rzecz biorąc jest to adres od 100000h do 10FFEFh. Jest to szczególny obszar pamięci, gdyż jest to jedyny obszar pamięci rozszerzonej, z którego możemy korzystać w trybie rzeczywistym. To wszystko, co tu opisałem ma bardzo duży wpływ na dzisiejsze procesory, ponieważ każdy nowy procek musi być kompatybilny z trybem rzeczywistym. http://binboy.sphere.pl/index.php?show=43 Tryby pracy procesorów Tryb rzeczywisty Jest to tryb bardzo "okrojony". Pamięć jest podzielona na segmenty. Każdy segment ma wielkość 64kB. W trybie rzeczywistym mamy dostępny tylko 1MB pamięci, ale i tak jest mniej, bo pamięć od 0xA0000-0xFFFFF jest zarezerwowana dla pamięci video i BIOSu. Mamy więc tylko ok. 640kB wolnych. Tryb ten pozostał nawet w najnowszych procesorach Athlon XP ze względu na kompatybilność ze starymi programami pisanymi dla procesora 8086. Do pisania prawdziwego, dobrego OSa tryb rzeczywisty nas w ogóle nie obchodzi. Tryb chroniony Tryb ten został wprowadzony dopiero w procesorze 286. Jest to specjalny tryb pracy procesora. Pamięć jest podzielona na segmenty, ale to ty decydujesz gdzie się segment zaczyna i jaką ma wielkość. Dla procesora 286 wynosiła ona max. 16MB, a dla procesorów od 386 wzwyż do 4GB (!). W opisach będziemy się opierać tylko na architekturze procesorów od 386 w górę. Nie ma sensu opisywać 286, bo nikt już go dziś nie używa. Opis trybu rzeczywistego Chcąc, nie chcąc, trzeba wiedzieć jak programować w trybie rzeczywistym. Potrzebne nam to będzie m.in. do napisania bootloadera oraz kodu inicjalizującego nasz OS. Inicjalizacja komputera Po włączeniu komputera procesor "budzi się" w trybie rzeczywistym. Jest to potrzebne, aby załadować BIOS, który jest przecież kodem 16-bitowym i używa specyficznych właściwości trybu rzeczywistego. Procesor skacze do specjalnego adresu w pamięci, gdzie znajduje się procedura skoku do właściwego punktu wejścia BIOSu. Pamięć w trybie rzeczywistym Jak już wspomniałem pamięć w RMODE (skrót od real mode - tryb rzeczywisty) jest podzielona na segmenty. Każdy segment ma limit 64kB. W trybie rzeczywistym jest tylko szesnaście segmentów: 0x0000,0x1000,0x2000,0x3000,...,0xF000. Segment 0x0000 jest zarezerwowany dla tablicy przerwań oraz niektórych danych komputera. Aby obliczyć fizyczne położenie takiego segmentu w pamięci, wystarczy wymnożyć numer segmentu przez 16, czyli w zapisie szesnastkowym dodać jedno 0 na koniec. Np. segment 0x4000 ma adres fizyczny 0x40000. Aby obliczyć adres fizyczny pary segment:offset wystarczy wykonać działanie:

adres_liniowy = (segment*16) offset Czasami widzisz numer segmentu, np. 0x5188. W rzeczywistości jest to segment 0x5000, tylko po przeliczeniu adresu segmentu segment:offset z powyższego równania wychodzi, że np. adres 0x5100:0x0010 to to samo, co 0x5000:0x1010. Poniżej przedstawiam skróconą mapę pamięci w RMODE. 0x0000:0x0000 - tablica wektorów przerwań 0x0000:0x7C00 - tu zostaje załadowany boot-sector przez BIOS 0x1000:0x0000-0x9000:0xFFFF - pamięć użytkownika (najlepiej używać z tego przedziału) 0xA000:0x0000 - pamięć video karty VGA (tylko dla trybu graficznego) 0xB000:0x0000 - pamięć video karty Hercules Monochrome 0xB800:0x0000 - pamięć trybu tekstowego karty VGA 0xC000:0x0000-0xF000:0xFFFF - pamięć BIOSu i inne Przerwania w trybie rzeczywistym Na samym początku pamięci RAM (adres 0x0000:0x0000) znajduje się tablica wektorów przerwań. Zostaje zainicjalizowana przez BIOS. Zawiera ona punkty wejścia do różnych procedur systemowych. Np. przerwanie 0x10 służy do obsługi karty graficznej, przerwanie 0x13 do obsługi dysków. Tablica wektorów przerwań to po prostu tablica par offset:segment. Przerwań może być tylko 256. Przerwania dzielą się na programowe i sprzętowe. Programowe są wywoływanie jedynie przez użytkownika, a sprzętowe może wywołać procesor. W dokumentacji Intela do procesora 386 jest jak byk napisane, że przerwania od 0x00 do 0x2F są zarezerwowane na wyjątki procesora oraz przerwania sprzętowe to i tak jakiś matoł projektujący BIOS umieścił tam przerwania użytkownika, przekierowując przerwania sprzętowe pod inne numery. I teraz jeśli w trybie chronionym chcesz obsługiwać przerwania sprzętowe i wyjątki procesora to musisz wysłać do PICa (Programmable Interrupt Controller) żądanie, aby przekierował przerwania na właściwe miejsce (ok. 15 linijek w C używając outportb). Kiedy procesor wykonuje przerwanie (sprzętowe, lub przy użyciu intrukcji int) na stos kładzione są następujące rejestry (w kolejności): ss, sp, flags, cs, ip. Znaczenie rejestrów: SS - segment stosu SP - aktualna pozycja stosu FLAGS - tu zawarte są flagi procesora CS - segment kodu IP - licznik programu (pozycja aktualnie wykonywanej instrukcji) Gdy procesor otrzyma żądanie przerwania, liczy sobie (w RMODE) adres przerwania w następujący sposób: Segment = wartość przy 0x0000:numer_przerwania*4 Offset = wartość przy 0x0000:(numer_przerwania*4)+2 Potem zapisuje stan ww. rejestrów i skacze do procedury obsługi przerwania. Opis trybu chronionego O trybie rzeczywistym już wystarczy. Teraz zajmijmy się trybem chronionym, ponieważ jego opis będzie trochę dłuższy. Na początek trochę nudnych rzeczy. UWAGA: Opisywane tutaj rzeczy są w większości przypadków prawdziwe tylko dla procesorów 386 i lepszych. Rejestry W trybie chronionym wszystkie rejestry procesora są rejestrami 32-bitowymi. Mamy więc rejestry: eax, ebx, ecx, edx, esi, edi, ebp, esp oraz cs, ds, es, fs, gs. W trybie rzeczywistym raczej nie używa się rejestrów fs i gs. Mimo, że rejestry segmentowe są 32-bitowe, to i tak procesor używa tylko ich "dolną" połowę. Stos Tutaj stos jest 32-bitowy. Jest to rozmiar domyślny elementu kładzionego na stos. Jeśli chcesz położyć element 16-bitowy, to musisz użyć rejestru 16-bitowego, lub wartości 16-bitowej (np. push word 1 lub push word [wartosc]), jednak prawie nigdy nie używa się argumentów 16-bitowych. Rejestry dodatkowe W trybie chronionym dostępne są także rejestry do kontroli procesora (są 32-bitowe). Są to rejestry:

CR0 - podstawowy rejestr kontroli procesora. Można go używać także w RMODE, ale to on właśnie służy do przełączania CPU w tryb chroniony i do kilku innych rzeczy CR1 - rejestr zarezerwowany CR2 - tutaj jest zapisany fizyczny adres, w którym wystąpił ostatni błąd strony (ang. Page Fault), ale o tym będzie później CR3 - tutaj zapisany jest fizyczny adres katalogu stron (o tym też później) CR4 - rejestr sterowania dostępny tylko dla nowych procesorów (o ile się nie mylę, jest on dostępny dla procesorów o architekturze 80686 i lepszych). Na razie nie będziemy o nim mówić, gdyż nie jest on nam potrzebny. Pominąłem tutaj m.in. rejestry debugowania, ale na razie to się nam i tak nie przyda. Poziomy uprzywilejowania W trybie chronionym istnieją tzw. poziomy uprzywilejowania (DPL). Dla architektury x86 są 4 poziomy uprzywilejowania od 0 do 3. Poziom 0 jest przewidziany dla jądra systemu, na tym poziomie można robić wszystko. Poziom 3 jest dla aplikacji użytkownika, ponieważ ma duże ograniczenia, np. nie można dokonywać operacji na portach czy na rejestrach sterowania procesora. Pamięć w trybie chronionym Tutaj jest znacznie lepiej niż w trybie rzeczywistym, gdzie wszystko było ustalone na "sztywno" (jednak są sposoby, aby to ominąć). Najważniejsze jest to, że TY decydujesz, jakie segment ma położenie (mówimy: bazę) i rozmiar (mówimy: limit). W trybie chronionym bazę i limit segmentu definiujemy w Globalnej Tablicy Deskryptorów (GDT - Global Descriptor Table). Jest to tablica o 64-bitowych wpisach. Wpisów tych może być max. 8192, jednak zazwyczaj używa się tylko kilku. GDT składa się z 2 części: nagłówka tablica właściwa Odblokowywanie linii A20 Linia A20 służy do odblokowywania dostępu do całej pamięci. Jeśli byśmy tego nie zrobili, pamięć byłaby dostępna tylko, co 1MB. To rozwiązanie istnieje jeszcze, ze względu na zaszłości historyczne. Swoją drogą, myślę, że w nowych płytach głównym mogliby wykurzyć to rozwiązanie. Ktoś może powiedzieć, że jest to potrzebne, aby się uruchamiały stare programy. Ciekawe jakie? No, ale nic. Trzeba wklepać kod, aby wejść w tryb chroniony. Podaję kod w assemblerze: setup_a20: call empty_8042 mov al,0xd1 out 0x64,al call empty_8042 mov al,0xdf out 0x60,al call empty_8042 empty_8042: dw 0xEB,0xEB in al,0x64 test al,2 jnz empty_8042