System operacyjny AlienOS¶
Contents
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)
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.