Program startowy
‘Kernel’ wymaga specjalnego programu startowego (‘bootloader’), który wykonuje programy inicjujące systemu i przygotowuje środowisko działania.
Program startowy wykonuje następujące czynności:
- ‣ Przełącza do trybu graficznego o maksymalnej dostępnej rozdzielczości i zachowuje jego dane oraz ustawia tryb pamięci wyświetlacza jako ‘write‐combining’.
- ‣ Wczytuje dane z tablic ACPI bez interpretowania zawartości DSDT i SSDT.
- ‣ Wyszukuje pierwszy dostępny plik “/boot/kernel” w systemie plików OUXFS i wczytuje go do pamięci, a następnie przelicza zdefiniowane w nim adresy (‘relocation’).
- ‣ Wyłącza PIC, włącza x2APIC. Wczytuje i zachowuje numery przekierowanych przerwań.
- ‣ Wylicza urządzenia magistral PCI oraz ustawia tryb pamięci urządzeń jako ‘non‐cacheable’.
- ‣ Wczytuje, sortuje i zachowuje tablicę znaczenia zakresów adresów (‘memory map’).
- ‣ Tworzy od dołu przestrzeni adresów wirtualnych pamięć dostępną dla ‘kernela’. Scala zakresy pamięci zarezerwowanej na dole lub na górze tego bloku i — jeśli konieczne — przenosi program startowy.
- ‣ Przygotowuje poniżej 1 MB pamięć (o tym samym adresie rzeczywistym i wirtualnym) na program startowy pozostałych procesorów i je uruchamia do trybu 64‐bitowego. Każdy z nich na końcu programu czeka na ustawienie przez ‘kernel’ adresu procedury dalszego uruchamiania.
- ‣ Inicjuje ‹menedżera pamięci› i wyświetla ekran startowy.
- ‣ Ustawia tryby pracy procesora, adres stosu procesora startowego i uruchamia ‘kernel’, przekazując mu zgromadzone dane.
Program główny ‘kernela’
Wykonuje następujące czynności:
- ‣ Kopiuje do własnych struktur dane przekazane przez program startowy.
- ‣ Inicjuje ‹menedżer logowania›.
- ‣ Ustawia struktury przerwań procesora. Oblicza częstotliwość zegara APIC na podstawie zegara RTC.
- ‣ Inicjuje ‹sterownik przepływu wykonania› i kontynuuje uruchamianie pozostałych procesorów.
- ‣ Zwalnia niepotrzebną już pamięć startową.
- ‣ Inicjuje ‹menedżer ACPI/AML› i wykonuje procedury konfiguracji urządzeń.
- ‣ Inicjuje ‹sterowniki› urządzeń magistral PCI.
- ‣ Uruchamia środowisko okienkowe, inicjuje ‹sterowniki› klawiatury i myszy.
Funkcjonalności
Przepływ wykonania
System wykonuje się na najwyższym poziomie uprzywilejowania procesora (“ring 0”). Procedury są eksportowane (“_export”), by były dostępne dla programów dołączanych do ‘kernela’, są prywatne w ‘kernelu’ (“_private”) lub wewnętrzne w ‹module› (“_internal”).
Programy w systemie wykonują się w następujących środowiskach:
- • przerwanie procesora
- • ‹zadanie› synchroniczne
- • procedura obsługi GUI
Na razie programy wykonują się tylko na startowym procesorze.
‹Znaczniki stanu›, ‹raporty›, ‹cyklery› i ‹impulsatory› mają taką samą funkcjonalność jak w OUX/C+. Ponadto są do dyspozycji ‹raporty czasowe›.
Wprowadzenie ‹raportów czasowych›
Międzyprocesorowy ‘lock’ z kodem powrotu
Umożliwia synchronizację wykonywania nie zatrzymujących się bloków programu między procesorami.
Po wywołaniu procedury “E_flow_I_lock” program wpada w pętlę oczekiwania na wejście do bloku programu, który może być jednocześnie wykonywany tylko przez jeden proces w systemie wieloprocesorowym. Gdy jako argument procedury “E_flow_I_unlock_r” zostanie podany kod oznaczający błąd, to jest on przekazywany wszystkim oczekującym procesom, umożliwiając przerwanie oczekiwania i emisję ‹zdarzenia› w każdym z nich.
O asynchroniczności wywołań sprzętowych
Kontrola błędów
Komunikaty linii
Komunikaty linii wypisuje się makrem nowej linii “G(fmt,…)” albo makrem kontynuacji linii “G_(fmt,…)”. Jako pierwszy parametr makra podaje się formatujący ciąg tekstowy. Po nim ewentualnie następują kolejne parametry zakodowane (prefiksem “%”) do wypisania w tym ciągu.
Po prefiksie “%” umieszcza się ewentualnie rozmiar bitowy parametru, ale na pewno – typ/format wypisywania. Są następujące typy parametrów:
- • “s” oznaczający ciąg tekstowy przydzielony przez ‹menedżera pamięci›, który zostaje przejęty przez ‹menedżera logowania›
- • “t” oznaczający ciąg tekstowy, który musi zostać zduplikowany
- • “z” oznaczający statyczny ciąg tekstowy, który jest obecny zawsze w kodzie programu
- • “x” oznaczający liczbę wypisywaną w formacie szesnastkowym bez znaku
‹Zdarzenia›
‹Zdarzenia› są emitowane w przypadku błędu wykonania procedury — w postaci kodu ~0, ~1, ~2 lub ~3. Do emisji służą makra blokowe “K(statement)” i “Kp(statement)” oraz makra liniowe wewnątrz bloków wyjścia z procedury “K_(error,statement)” i “Kp_(error,statement)”, którymi otacza się wywoływaną procedurę. Kody błędów mają następujące znaczenia:
- ~0 to niewykonanie procedury bez skutków ubocznych
- ~1 〃 ze zgubieniem pamięci/obiektu
- ~2 〃 i uszkodzenie kolekcji obiektów lub obiektu będącego w kolekcji
- ~3 〃 i uszkodzenie danych w pamięci nieulotnej
- ~4 〃 i późno wykryty błąd ‘kompilacji’
W przypadku, gdy wywołanie procedury wróci z kodem błędu, a jest w normalnym toku wykonywania procedury nadrzędnej, to tylko w przypadku błędu ~0 jest wykonywany blok wyjścia z błędem. W przypadku pozostałych kodów błędów jest wykonywany natychmiastowy powrót z procedury i kod błędu przekazywany wyżej. W przypadku, gdy wywołanie procedury wróci z jakimkolwiek kodem błędu wewnątrz bloku wyjścia z procedury (albo z błędem, albo zwykłego), to jest wykonywany natychmiastowy powrót z procedury z kodem błędu podanym w makrze lub wyższym (w sensie wartości bez negacji), jeśli z takim wróciła procedura.
‹Moduły›
Interpretator ACPI/AML
Zawiera kompletny ‘parser’ AML zgodny z ACPI 6.5, natomiast interpretator instrukcji przebiega przepływ wykonania i oblicza wartości arytmetyczne, ale nie uzyskuje dostępu do pamięci. Na razie został rozbudowany na tyle, na ile symulator maszyny wirtualnej pozwalał przetestować. Posiada potencjał tworzenia w przyszłości procedur ACPI w kodzie maszynowym; po dodaniu asemblera.
W przypadku błędu składni podczas interpretacji startowej wyskakuje do nadrzędnego obiektu i kontynuuje.
Kontrolki graficzne
Są zaimplementowane następujące kontrolki graficzne możliwe do wstawienia do dowolnego okna:
- • napis
- • przycisk
- • jednoliniowe pole edycji tekstu
Jeśli kontrolki są używane w danym oknie, to należy w procedurze tworzenia ‹modułu› po utworzeniu okna wykonać “E_controls_M” oraz dodać je odpowiednimi procedurami ‹modułu› “controls”.

