2017-02-13 51 views
5

Pracuję nad wbudowanym programem dla intel i386, i staram się dowiedzieć, jak korzystać z zegara sprzętowego. Przeczytałem here (i innych miejsc), że przerwanie timera jest 0x08, ale this page (I różne inne źródła) mówią, że pierwsze 32 przerwań są zarezerwowane dla wyjątków, a przerwać 0x08 w szczególności dla podwójnego błędu. Która prawda? Jak ustawić przerywacz czasomierza, używając albo zespołu albo bardzo niskiego poziomu C bez wywołań systemu operacyjnego?W jaki sposób przerwanie timera może być 0x08, jeśli pierwsze 32 przerwań są zarezerwowane dla wyjątków?

Pracuję nad prostym systemem operacyjnym, aby dowiedzieć się więcej o rozwoju systemu operacyjnego, więc nie mam dostępu do niczego takiego jak Linux lub wywołania systemowe (chyba że sam implementuję wywołania systemowe, ale tworzenie w pełni zgodnego z POSIX OS jest daleko poza zakresem tego projektu, więc wolę trzymać się prostych, choć nieco hackowskich rozwiązań).

Jeśli to ma znaczenie, używam tego na QEMU, a nie na rzeczywistym fizycznym i386.

+2

Zazwyczaj remapuje się przerwań. Zobacz [artykuł osdev] (http://wiki.osdev.org/8259_PIC). – Jester

+0

Czy zamierzasz napisać system operacyjny w trybie rzeczywistym lub tryb chroniony numer jeden? Zakładam tryb chroniony. –

+0

@MichaelPetch Ponieważ nie wiem, co to oznacza, przypuszczam, że powinienem założyć to samo co ty. (Sprawdzę, co to znaczy i wrócisz do ciebie) – ItsTimaiFool

Odpowiedz

2

Większość ludzi przyjmuje to (błąd za pomocą INT8) jako błąd konstrukcyjny w oryginalnej architekturze IBM PC. Aby (częściowo) chronić winnych, oryginalny 8088 naprawdę nie używał tego wektora - został jednak od samego początku oznaczony jako "zarezerwowany" przez Intela.

Zanim wynaleziono tryb chroniony, konflikt ten w rzeczywistości nie wystąpił (procesory < 80286 nie wykorzystały tego podwójnego błędu). W większości dzisiejszych komputerów PC 8259 PIC wciąż istnieje, choć nie jest to osobny chip, ale ukryty gdzieś w zestawie układów PC. Na szczęście INT08 dla przerwania timera nie jest wyryte w sprzęcie, ale raczej zainicjowane w PIC przez BIOS komputera. Tak więc, chronione systemy operacyjne mogą z łatwością zmienić odwzorowanie przerwań PIC na inne, dogodniejsze miejsca w celu uniknięcia konfliktu. Według mojej wiedzy, tylko DOS i inne wczesne systemy operacyjne przyjmują przerwanie timera na INT8.

+0

Jest odwrotnie: IRQ0 mógł zostać zmapowany do wektora 08, ponieważ był nieużywany (nie jest to wada 8086). #DF [nie był obecny na oryginalnym 8086 (Virtual PDF Page 40)] (https://edge.edx.org/c4x/BITSPilani/EEE231/asset/8086_family_Users_Manual_1_.pdf). Byłoby miło dołączyć taki schemat do twojego pytania :) –

+0

@MargaretBloom: Rzeczywistość jest taka, że ​​wektor 08h nie był "nieużywany * .W rzeczywistości był wymieniony jako ** zarezerwowany ** aż do dokumentów specyfikacji projektu Intela Intel na 8086/8088 zarezerwował pierwsze 32 wektory interrurpt. Problem polega na tym, że IBM zignorował Intel i faktycznie używał zarezerwowanych wektorów dla 8259. To spowodowało problemy, gdy pojawiły się 80286 i 80386 (zderzenie koprocesora i zderzenie 8259A) Gdyby IBM nie zaprojektował wadliwego systemu od samego początku i nie dostosował go do Intela, ten klaster nie stałby się –

+0

@MargaretBloom: Jeśli przejrzysz [podręcznik iAPX 86 i 88 Intel] (http://www.mirrorservice.org/ sites/www.bitsavers.org/pdf/intel/_dataBooks/1981_iAPX_86_88_Users_Manual.pdf) od 1981 r., strona 4-17 jest szczególnie interesująca, jest to przejście _Jest pokazane na rysunku 4-18, pierwsze pięć przerwań wektory są powiązane z zapoczątkowanymi przez oprogramowanie przerwaniami i sprzętowym niemaskowalnym przerwaniem (NMI) . Następne 27 wektorów przerwań jest zarezerwowanych przez firmę Intel i nie należy ich używać, jeśli zachowana zostanie kompatybilność z przyszłymi produktami Intela. –