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:
- Jądro inicjuje tabelę przerwań Descriptor tak że przerwanie jest wystawiony okresowo (np milisekundy) i wywołuje procedurę określoną w jądrze.
- 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:
- wysłać jakieś dane do PIC (
outb
i co-nie), aby go zainicjować. - 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.
- 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?
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. –
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