logo ‟overcq”

OUX/C+ OS

Podręcznik programisty OUX/C+ OS

Ostatnia aktualizacja: .

Program startowy

‘Kernel’ wymaga specjalnego programu startowego (‘boot loader’), który wykonuje programy inicjujące systemu i przygotowuje środowisko działania.

Program startowy wykonuje następujące czynności:

System operacyjny OUX/C+

Program główny ‘kernela’

Wykonuje następujące czynności:

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:

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›

Oczekiwanie na przerwanie procesora

Procedura “E_flow_Q_interrupt_I_wait” umożliwia oczekiwanie bez blokowania ‹zadań› na przerwanie procesora wykonujące procedurę “E_flow_Q_interrupt_I_signal”.

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_Z_lock_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 procesor w systemie wieloprocesorowym. Gdy jako argument procedury “E_flow_Z_lock_I_unlock_and_return” zostanie podany kod oznaczający błąd, to jest on przekazywany wszystkim oczekującym procesorom, umożliwiając przerwanie oczekiwania i emisję ‹zdarzenia› na każdym z nich. Następnie to ‹zdarzenie› jest obsługiwane tylko na tym procesorze, który je wyemitował.

O asynchroniczności wywołań sprzętowych

Międzyprocesorowe ‘locki’ ‘read’/‘write’ z kodem powrotu

Rozszerzają zwykły ‘lock’ o logikę nieblokowania się wzajemnie procedur tylko czytających dane.

Wywołanie procedury “E_flow_Z_lock_rw_I_lock_write” pozwala wykonać program tylko w przypadku, gdy ani ‘write‐lock’, ani ‘read‐lock’ nie są zajęte, natomiast wywołanie procedury “E_flow_Z_lock_rw_I_lock_read” umożliwia wykonanie w przypadku, gdy ‘read‐lock’ jest zajęty.

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:

‹Zdarzenia›

‹Zdarzenia› są emitowane w przypadku błędu wykonania procedury — w postaci kodu błędu. Do emisji służą makra blokowe “K(statement)” i “Kp(statement)” (dla procedur zwracających adres: “KP(statement)” i “KPp(statement)”) oraz makra liniowe wewnątrz bloków wyjścia z procedury “K_(error,statement)” i “Kp_(error,statement)” (〃: “KP_(statement)” i “KPp_(statement)”), którymi otacza się wywoływaną procedurę. Kody błędów mają następujące znaczenia:

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 w zwykłych procedurach, a w przypadku błędu 0 w procedurach zwracających adres — 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 podanym kodem błędu lub wyższym (w sensie wartości bez negacji), jeśli z takim wróciła procedura.

‹Zdarzenia› są obsługiwane przy użyciu makra “K_V(context_ip,error,statement)”.

‹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:

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”.