2012-04-29 35 views
14

Piszę małe jądro, żeby trochę pogrzebać w rzeczach niskiego poziomu. Teraz uruchamia się w Virtual Box i mogę wyświetlać tekst na ekranie, przydzielać trochę pamięci i inne naprawdę podstawowe rzeczy. Jest napisany w C++ i trochę asm.(Pisanie jądra) Jak zmodyfikować tabelę deskryptorów przerwań?

Jedną z rzeczy, które chciałem zbadać, był mechanizm wielozadaniowości. Jak rozumiem, to idzie tak:

  1. Jądro inicjuje tabelę przerwań Descriptor tak że przerwanie jest wystawiony okresowo (np milisekundy) i wywołuje procedurę określoną w jądrze.
  2. Po wywołaniu procedury może zdecydować o ustawieniu segmentów kodu/danych i wskaźnika stosu na kontekst innego programu, "przełącznik kontekstowy".

Tak, wydawało się proste w koncepcji, ale wiedziałem, że szczegóły będą o wiele bardziej owłosione. Znalazłem kilka rzeczy on-line, ale terminologia jest bardzo różna, a przykłady wydają się pochodzić z kontekstów, których nie mam (np. Z jądra Linuksa).

Jednak sposób ustawić tablice deskryptorów wydaje się być tak:

  1. wysłać jakieś dane do PIC (outb i co-nie), aby go zainicjować.
  2. Przygotuj tabelę przerwań w pamięci, ze wskaźnikami funkcji do potrzebnych procedur, uważając, że funkcje mogą być procedurami obsługi sygnałów.
  3. Załaduj tabelę za pomocą lidt.

Jednak nie mogę znaleźć zbyt wielu rzeczy na temat robienia tych rzeczy, czy też jest to poprawne. Czy ktoś ma zasoby dla oszołomionego twórcy jądra?

+0

Interesujące pytanie, oto fajna społeczność: http://www.osdever.net/ To nie jest odpowiedź na twoje pytanie bezpośrednio, ale jest tam kilka przydatnych informacji. –

+0

Jeszcze lepsza społeczność (z forum i wiki, a także z odpowiednim kanałem irc - #osdev @ irc.freenode.net) można znaleźć na osdev.org. – Griwes

Odpowiedz

6

Po uruchomieniu komputera, BIOS programuje PIC w taki sposób, że IRQ0 do IRQ15 są powiązane z int 8 przez int 0Fh i int 70h przez int 77h. To jest w porządku dla trybu adresu rzeczywistego, w którym działa BIOS i działa MSDOS.

Ale trzeba zmienić to odwzorowanie przy przechodzeniu do trybu chronionego, ponieważ niektóre ważne wyjątki dotyczą stron od 8 do 0Fh (w szczególności #GP, #SS, #PF). Chcesz tego, ponieważ chcesz łatwo odróżnić te wyjątki od przerwań sprzętowych pochodzących z timera i zegara czasu rzeczywistego, klawiatury i myszy, dysków i portów we/wy (szeregowych i równoległych).

To prawdopodobnie pierwszy krok, który opisałeś. Tak więc, wyszukaj online "przerwań przerwań PIC" lub coś w tym rodzaju. Pobierz również specyfikacje dla układu 8259 (PIC), aby mieć lepsze pojęcie o tym, co robisz i jak to działa. "HelpPC" to dobre, stare odniesienie, które zawiera niektóre informacje na temat różnych urządzeń PC.

Istnieją również „PCGPE” (Programowanie gier PC Encyklopedia) i „RBIL” (Lista przerwań Ralfa Browna), które mogą pomóc.

Konfiguracja IVT/IDT jest opisana w dokumentacji procesora Intel i AMD. Wszystko tam jest. Nie najmilej czytany, ale najbardziej szczegółowy i autorytatywny.

Istnieje wiele stron internetowych z domowych napar hobbystów OS i tym podobne, gdzie można znaleźć więcej szczegółów i fragmentów kodu.

+0

Zauważyłem, że jakiś zmieniony kod unoszący się wcześniej. Być może nie rozumiem szczegółów dotyczących trybu chronionego i rzeczywistego, ale jak rozumiem, jądro działa w trybie rzeczywistym, ale może przełączyć się w tryb chroniony, gdy uruchomiony jest program użytkownika. Jednak czy nie przełącza się w tryb rzeczywisty w przełączniku kontekstu? Robi się to przez przerwanie, prawda? Czy przerywniki muszą być remapowane tylko raz, zanim chroniony program kiedykolwiek zostanie uruchomiony? – rovaughn

+0

Normalnie, jeśli istnieje jakikolwiek przełącznik, jest on od rzeczywistego do chronionego i jest wykonywany tylko raz, bardzo wcześnie, kiedy jądro się uruchamia. –

6

Odpowiedź na to pytanie jest zbyt duża, aby pasować tutaj. Ja proponuję dwa zasoby, które dadzą Ci niezbędną wiedzę:

  • JamesM's kernel development tutorial poprowadzi cię poprzez rozwój bardzo podstawowym jądro, które obejmuje ten. Będziesz chciał zwrócić szczególną uwagę na rozdziały 4 i 5. Zawiera pełny kod.
  • OSDev.org Materiały referencyjne. Zawiera wszystkie potrzebne informacje techniczne. Bardziej szczegółowy i dokładniejszy niż samouczek.

Jeśli naprawdę chcesz zrozumieć te rzeczy, sugeruję przeczytanie artykułów w OSDev, aby spróbować napisać wszystko samemu. Zacznij od uruchamiania, wyświetlania ekranu, obsługi pic i irq. Skorzystaj z samouczka, jeśli utkniesz.

+0

Samouczek Jamesa Molloya jest naprawdę dobry, ale nie powinien być polecany nowym użytkownikom, ponieważ daje zbyt dużo kodu do skopiowania, bez większego wyjaśnienia - może się to zmieni, gdy JamesM wyda nową wersję serii. Dla początkujących tutoriale na www.brokenthorn.com są znacznie lepsze. – Griwes