Agnix to projekt Open-Source, który został założony w celu dostarczenia edukacyjnego, sieciowego jądrasystemu operacyjnego. Agnix jest jądrem dość rozbudowanym, pisanym bardzo starannie, idealnym do rozpoczęcia prawdziwej nauki architektury systemów operacyjnych. Dodatkowo Agnix jest małym i szybkim jądrem, dlatego polecam wykorzystywanie go w zastosowaniach przemysłowych, wbudowanych oraz wszędzie tam, gdzie potrzebny jest mały i stabilny system operacyjny
Jak mogę pobrać Agnixa?
Jeżeli chcesz pobrać źródła bądź obrazy Agnixa idź do sekcji download bądź wykorzystaj jeden z serwerów lustrzanych Sourceforge
Subskrypcja
Jeżeli chcesz być powiadomiony o nowych wersjach Agnixa, idź do sekcji subskrypcja
Cechy Agnixa
Agnix jest pisany w języku assembler i C, z dużą przewagą tego drugiego. Główną cechą Agnixa jest czysty i przemyślany kod, którego analiza może dostarczyć wiele cennych informacji podczas nauki budowy systemów operacyjnych.
Wszystkie podsystemy i moduły zostały przeze mnie zaprojektowane i napisane od początku, ale jądro nie jest jeszcze w pełni ukończone. W chwili obecnej Agnix wspiera następujące elementy (pełna lista u dołu strony):
Pamięc: 32-bitowy tryb chroniony, wsparcie dla stronicowania
Pamięc wirtualna: obsługa algorytmów (binarnego i bliźniaków) przydziału pamięci
Zarządzanie zadaniami: wielowątkowość, zadania przełączane sprzętowo, szeregowanie round-robin
Synchronizacja: blokady pętlowe i semafory
Obsługa przerwań: szybka obsługa przerwań przez wątek fastirq
Zegary: zegary RT, zegar systemowy o częstotliwości 100Hz
Obsługa sieci: protokoły ethernet, ARP, IP oraz wsparcie dla routingu IP
Interfejs sterowników: własny interfejs sterowników nazwany ADI (Agnix Driver Interface)
Wsparcie dla magistral: pełne wsparcie dla szyny PCI, urządzeń PCI oraz routingu przerwań PCI
Terminale: wsparcie dla przełączanych terminali
Struktury danych: hashing z adresowaniem otwartym, listy, kolejki
W przyszłosci
Pełne wsparcie dla uruchamiania programów skompilowanych dla Linuxa (shell, binutils, X server etc)
Pełne wsparcie dla stosu sieciowego
Więcej sterowników urządzeń
Więcej dokumentacji!
Po co zacząłem pisać Agnixa?
Dobre pytanie :) Niektórzy powiedzą, że jestem wariat, bo zacząłem pisanie od początku jądra systemu operacyjnego, a wokół jest wiele świetnych Open-Source'owych systemów takich jak Linux. Ale ja myśle, że warto było, bo przynajmniej gruntownie utrwaliłem sobie wiedzę z zakresu architektury IA32, architektury systemów UNIX'owych, systemów mikroprocesorowych, sterowników urządzeń, protokołów sieciowych, stosu sieciowego (i wiele innych rzeczy) i w tej chwili mam pełną satysfakcję, gdyż to jądro od początku pisałem sam.
Główne cele
Głównym celem projektu jest dostarczenie pełnego sieciowego jądra systemu operacyjnego, zgodnego z jądrem Linuxa na poziomie wywołań systemowych. Zgodność z jądrem Linuxa jest bardzo ważna, ponieważ Agnix ma umożliwiać uruchamianie programów skompilowanych dla jądra Linuxa - jest to podstawa tego projektu
Status projektu
Projekt jest jeszcze wczesny, na napisanie czeka jeszcze wiele modułów. Kompletność poszczególnych elementów jądra przedstawia poniższa tabelka:
Podsystem przydziału pamięci
Algorytm binarny
Ukończony
Algorytm bliźniaków
Ukończony
Alokator płytkowy
Nie zaczęty
Obsługa wyjątku błędu strony
Zaczęty
Kopiowanie przy zapisie
Nie zaczęty
Stronicowanie za żądanie
Nie zaczęty
Testy pamięci
Ukończony
Podsystem zarządzania zadaniami
fork()
Ukończony
Sprzętowe przełączanie zadań
Ukończony
Procesy jądra
Ukończony
Procesy użytkownika
Nie zaczęty
Wątek idle
Ukończony
Usypianie wątków
Ukończony
Budzenie wątków
Ukończony
Kolejki oczekiwań
Ukończony
Szeregowanie round-robin
Ukończony
Podsystem IPC (System V)
Pamięć współdzielona
Nie zaczęty
Semafory
Nie zaczęty
Kolejki komunikatów
Nie zaczęty
Warstwa zależna od architektury (i386)
Inicjalizacja zegara
Ukończony
Inicjalizacja przerwań
Ukończony
Inicjalizacja pułapek
Ukończony
Inicjalizacja stronicowania
Ukończony
Wsparcie dla 4MB stron
Ukończony
Mapowanie pamięci pod 0xc0000000
Ukończony
Identyfikacja typu procesora
Ukończony
Identyfikacja możliwości procesora
Ukończony
Obliczanie szybkości procesora
Ukończony
Wsparcie dla TSC
Ukończony
Wsparcie dla MSR
Nie zaczęty
Wsparcie dla MTRR
Nie zaczęty
Wsparcie dla PMC
Nie zaczęty
do_machine_reboot()
Ukończony
do_machine_powerdown()
Ukończony
do_machine_halt()
Ukończony
Wsparcie dla APM
Ukończony
Wsparcie dla SMBios
Zaczęty
Obługa przerwań w wątkach
Ukończony
Podsystem sterowników
Interfejs driverów
Ukończony
Zarządzanie sterownikami znakowymi
Ukończony
Zarządzanie sterownikami blokowymi
Zaczęty
Zarządzanie sterownikami sieciowymi
Ukończony
Sterownik konsoli tekstowej
Ukończony
Sterownik klawiatury
Ukończony
Sterownik układu 8254
Ukończony
Sterownik układu 8259a
Ukończony
Sterownik RTC
Ukończony
Sterownik DMA
Ukończony
Sterownik i387
Nie zaczęty
Sterownik szyny PCI
Ukończony w 90% (brakuje skanowania podrzędnych szyn)
Sterownik karty RTL 8029(AS)
Ukończony
Sterownik stacji dyskietek
Zaczęty
Podsystem stosu sieciowego
Zarządzanie warstwą 2 stosu sieciowego
Ukończony
Zarządzanie warstwą 3 stosu sieciowego
Zaczęty
Protokół ethernet
Ukończony
Protokół ARP
Ukończony
Protokół IP
Zaczęty
Routing IP
Nie zaczęty
Protokół TCP
Nie zaczęty
Protokół UDP
Nie zaczęty
Protokół ICMP
Nie zaczęty
Interfejs gniazdek
Nie zaczęty
Systemy plików
Obsługa VFS
Nie zaczęty
Obsługa RamFS
Nie zaczęty
Obsługa EXT2
Nie zaczęty
Obsługa FAT
Nie zaczęty
Zegary
sleep_timeout()
Ukończony
Zegary jednorazowe
Ukończony
Zegary periodyczne
Ukończony
Struktury danych
Interfejs dla hashingu
Ukończony
Hashing z adresowaniem otwartym
Ukończony
Interfejs kolejek
Ukończony
Kolejki FIFO i LIFO
Ukończony
Listy
Ukończony
Inne podsystemy
Zarządzanie licznikami
Ukończony
Zarządzanie zasobami systemowymi
Ukończony
Jak widać, jądro nie jest jeszcze skończone, ale to chyba dobrze, przynajmniej jest co do roboty :) W wersji 0.0.4 dodałem obsługę pseudoFS, zalążka systemu VFS. Dodałem także konsolę za pomocą której można monitorować oraz konfigurować jądro oraz oglądać statystyki itp. W tej fazie projektu jest to dosyć potrzebne, ale w przyszłości będzie to zlikwidowane, a konfiguracja wszelkich parametrów jądra (adresów interfejsów, routingu, filtra pakietów) będzie się odbywała za pomocą wywołań systemowych z poziomu użytkownika, jak ma to miejsce w jądrze Linuksa.
Dokumentacja
Dokumentacja projektu jest bardzo ważną jego częścią, jeżeli przyjmiemy, że w projekcie będą uczestniczyły inne osoby. Jednak niekiedy brakuje czasu aby pisać kompletny manual do projektu. No a jak sie nie ma czasu, to należy sobie radzić w inny sposób, dl
atego dokumentację dla developerów kodu Agnixa w większości postanowiłem wygenerować programem Doxygen. Umie on wydzielić struktury kodu z plików źródłowych i wygenerowac dokumentację online w HTML'u oraz manuale offline w Latex'ie. Może on także automatycznie znaleźć zależności pomiędzy poszczególnymi modułami kodu w postaci grafów zależności, diagramów dziedziczenia (w przypadku klas) oraz diagramów współpracy. Doxygen jest pisany przez Dimitri van Heesch
Pomoc
Na napisanie czekają moduły oznaczone na czerwono. Moduły ukończone, także mogą być poprawiane i rozwijane. Także jeżeli chciałbyś pomóc w rozwoju jądra Agnixa to zgłoś się jak najszybciej do mnie na adres dembol@nasa.com.pl i opowiedz mi co chciałbyś rozwinąć lub napisać, albo jeszcze lepiej, dopisz coś i się od razu pochwal :). Jestem otwarty na każdą propozycję i współpracę.
Testy
Agnix był i jest testowany na emulatorach QEMU, Bochs i VMware oraz na rzeczywistych maszynach. Jednakże korzystam przede wszystkim z emulatorów, gdyż pisanie jądra wymaga częstego resetowania a bez emulatorów byłoby to naprawde bardzo czasochłonne
Licencja
Agnix jest rozprowadzany na licencji GNU i jest projektem Open-Source.
Wsparcie projektu
Zachęcam wszystkich do wspierania projektu. Jeżeli chciałbyś to uczynić, to proszę zwróć się na adres dembol@nasa.com.pl