System operacyjny AlienOS

Format binarny

Wygląda na to, że kosmici są bardzo zaawansowani – używają 64-bitowej architektury x86 oraz formatu ELF.

Programy kosmitów są statycznie zlinkowanymi plikami ELF typu ET_EXEC (co oczywiście oznacza ExtraTerrestial EXECutable). Nie używają dynamicznej alokacji pamięci i zawsze są ładowane pod adresy w zakresie 0x31337000 .. 0x80000000. Przy starcie programu, rsp powinien zawierać adres sensownego stosu, a wartośc pozostałych rejestrów nie jest istotna.

Oprócz standardowych segmentów PT_LOAD, pliki te mogą również zawierać segment specjalnego typu PT_PARAMS (0x60031337). Taki segment, o ile istnieje, jest używany do przekazania parametrów przez system operacyjny. Parametry do programu są zawsze typu int i są przekazywane w formie binarnej (4 bajty, little-endian). Rozmiar segmentu PT_PARAMS wskazuje, ile parametrów dany program przyjmuje (p_memsz / 4). Przed startem programu, system operacyjny umieszcza wartości parametrów w tym segmencie. Jeśli program nie ma takiego segmentu, znaczy to, że nie przyjmuje parametrów.

Wywołania systemowe

Wywołania systemowe wykonywane są za pomocą instrukcji syscall. Numer wywołania systemowego przekazuje się w rejestrze rax, wartość zwracana z wywołania znajduje się również w rejestrze rax, a parametry znajdują się w rejestrach rdi, rsi, rdx, r10 (w tej kolejności). Istnieją następujące wywołania systemowe:

  • 0: void noreturn end(int status)
  • 1: uint32_t getrand()
  • 2: int getkey()
  • 3: void print(int x, int y, uint16_t *chars, int n)
  • 4: void setcursor(int x, int y)

end

Kończy działanie programu, z podanym kodem wyjścia. Kod wyjścia powinien być w zakresie 0-63.

getrand

Zwraca losową 32-bitową liczbę.

getkey

Czeka na naciśnięcie klawisza na klawiaturze i zwraca jego kod. Znamy następujące kody klawiszy na klawiaturach kosmitów:

  • 0x0a: enter
  • 0x20-0x7e: jak w ASCII
  • 0x80: strzałka do góry
  • 0x81: strzałka w lewo
  • 0x82: strzałka w dół
  • 0x83: strzałka w prawo

W systemie AlienOS nie występuje echo – naciśnięte klawisze nie są automatycznie wypisywane na terminal.

print

Wypisuje dane znaki na ekran w podanej pozycji (x, y). Kosmici używają terminali tekstowych o wymiarach 80×24. x oznacza indeks kolumny, liczony od 0 z lewej strony. y oznacza indeks wiersza, liczony od 0 od góry terminala. chars jest wskaźnikiem na n znaków do wypisania w danej linijce, zaczynając od danej kolumny i idąc w prawo. Każdy znak jest 16-bitową liczbą z następującymi polami:

  • bity 0-7: kod znaku w ASCII (zawsze jest z zakresu 0x20 .. 0x7e – kosmici nie są jeszcze wystarczająco zaawansowani, żeby wynaleźć Unicode).
  • bity 8-11: kolor znaku:
    • 0: czarny
    • 1: niebieski
    • 2: zielony
    • 3: turkus
    • 4: czerwony
    • 5: różowy
    • 6: żółty
    • 7: jasnoszary
    • 8: ciemnoszary
    • 9: niebieski (jasny)
    • 10: zielony (jasny)
    • 11: turkus (jasny)
    • 12: czerwony (jasny)
    • 13: różowy (jasny)
    • 14: żółty (jasny)
    • 15: biały
  • bity 12-15: nie widzieliśmy, żeby były używane

Wywołanie print nie zmienia pozycji kursora na terminalu.

setcursor

Przesuwa kursor w terminalu na podane współrzędne.