Inhaltsverzeichnis

Lyx OS – Syscall-ABI v1.0

Diese Seite dokumentiert die vollständige Syscall-Schnittstelle von Lyx OS (182 Syscalls in 14 Kategorien). Sie richtet sich an Entwickler, die Ring-3-Anwendungen schreiben, Kernel-nahe Bibliotheken implementieren oder Syscalls direkt in NASM-Assembly nutzen.

Anwendungen entwickeln · Architektur · Übersicht


1. Aufrufkonvention

Lyx OS nutzt ausschließlich die SYSCALL/SYSRET-Instruktion (AMD64 Fast Syscall). Es gibt keine Int-80-Kompatibilität und kein Vsyscall-Interface.

Register-Layout

Eingabe:
  rax  = Syscall-Nummer (0x0000 – 0x0DFF)
  rdi  = Argument 1
  rsi  = Argument 2
  rdx  = Argument 3
  r10  = Argument 4  (statt rcx — wird vom SYSCALL-Mechanismus überschrieben)
  r8   = Argument 5
  r9   = Argument 6

Ausgabe:
  rax  = Fehlercode  (0 = Erfolg; >0 = ERR_* Konstante)
  rdx  = Rückgabewert (fd, Adresse, Byte-Anzahl, PID, ...)

Nicht verändert (callee-saved):  rbx, rbp, r12–r15
CLOBBERT:                        rcx, r11 (SYSCALL-Mechanismus)
                                 rdi, rsi, r10, r8, r9

Zwei-Register-Rückgabe

Fehler und Nutzwert kommen in zwei getrennten Registern. Kein globales errno, kein Vorzeichentest auf einem einzigen Register.

rax = 0      → Erfolg; Nutzwert steht in rdx
rax = ERR_*  → Fehler; rdx ist undefiniert

lyxc –target=lyxos übersetzt das als Tupel-Syntax:

var fd, err := sys_open(AT_CWD, "config.txt", O_READ, 0);
if (err != ERR_OK) {
    EPrintLn("open fehlgeschlagen: " + IntToStr(err));
    return 1;
}

NASM-Beispiel

; sys_write(FD_STDOUT, buf, len)  →  bytes_written in rdx, Fehler in rax
mov  rax, 0x0203        ; sys_write
mov  rdi, 1             ; arg1: fd = FD_STDOUT
mov  rsi, buf           ; arg2: Puffer
mov  rdx, len           ; arg3: Länge
syscall
test rax, rax
jnz  .error             ; rax ≠ 0 → Fehler
; rdx = Anzahl tatsächlich geschriebener Bytes

lyxc-Builtin-Mapping

lyxc-Builtin LyxOS-Syscall
PrintLn(s) sys_write(FD_STDOUT, …)
EPrintLn(s) sys_write(FD_STDERR, …)
mmap(…) sys_mmap(…)
open(path, …) sys_open(AT_CWD, path, …)
read(fd, …) sys_read(fd, …)
write(fd, …) sys_write(fd, …)
close(fd) sys_close(fd)

2. Fehlercodes

con ERR_OK          : int64 := 0   // Erfolg
con ERR_PERM        : int64 := 1   // Zugriff verweigert
con ERR_NOENT       : int64 := 2   // Datei / Ressource nicht gefunden
con ERR_BUSY        : int64 := 3   // Ressource belegt
con ERR_IO          : int64 := 4   // I/O-Fehler
con ERR_NOMEM       : int64 := 5   // Kein Speicher
con ERR_AGAIN       : int64 := 6   // Nochmal versuchen (würde blockieren)
con ERR_INVAL       : int64 := 7   // Ungültiges Argument
con ERR_OVERFLOW    : int64 := 8   // Puffer- / Wert-Überlauf
con ERR_TIMEOUT     : int64 := 9   // Zeitüberschreitung
con ERR_EXIST       : int64 := 10  // Existiert bereits
con ERR_NOTDIR      : int64 := 11  // Kein Verzeichnis
con ERR_ISDIR       : int64 := 12  // Ist ein Verzeichnis
con ERR_NOTEMPTY    : int64 := 13  // Verzeichnis nicht leer
con ERR_BADFD       : int64 := 14  // Ungültiger File-Deskriptor
con ERR_NOSYS       : int64 := 15  // Syscall nicht implementiert
con ERR_NOTSUP      : int64 := 16  // Operation nicht unterstützt
con ERR_RANGE       : int64 := 17  // Wert außerhalb des gültigen Bereichs
con ERR_FAULT       : int64 := 18  // Ungültige Speicheradresse
con ERR_LOOP        : int64 := 19  // Symbolischer-Link-Schleife
con ERR_NAMETOOLONG : int64 := 20  // Pfad-Komponente zu lang
con ERR_NOTCONN     : int64 := 21  // Socket nicht verbunden
con ERR_CONNREFUSED : int64 := 22  // Verbindung abgelehnt
con ERR_ADDRUSE     : int64 := 23  // Adresse bereits in Benutzung
con ERR_BROKEN      : int64 := 24  // Verbindung / Pipe getrennt
con ERR_CANCELED    : int64 := 25  // Operation abgebrochen
con ERR_DEADLOCK    : int64 := 26  // Würde Deadlock verursachen
con ERR_TOOBIG      : int64 := 27  // Argument / Daten zu groß
con ERR_NODEV       : int64 := 28  // Kein solches Gerät
con ERR_CAPVIOL     : int64 := 29  // Capability-Verletzung
con ERR_AIBUSY      : int64 := 30  // KI-Inferenz-Engine ausgelastet
con ERR_BADMODEL    : int64 := 31  // Ungültiges oder nicht unterstütztes KI-Modell
con ERR_CTXFULL     : int64 := 32  // KI-Kontextfenster voll
con ERR_NO_DISPLAY  : int64 := 33  // Kein Anzeigegerät vorhanden
con ERR_BAD_FORMAT  : int64 := 34  // Pixel-Format nicht unterstützt
con ERR_GPU_FAULT   : int64 := 35  // GPU-Fehler / Command-Buffer ungültig


3. Standard-Konstanten

// Standard-File-Deskriptoren
con FD_STDIN  : int64 := 0
con FD_STDOUT : int64 := 1
con FD_STDERR : int64 := 2

// Spezielle dir_fd-Werte (alle Pfad-Syscalls nehmen dir_fd als erstes Argument)
con AT_CWD  : int64 := -1   // Aktuelles Arbeitsverzeichnis
con AT_ROOT : int64 := -2   // Dateisystem-Wurzel


4. Syscall-Tabelle

Kategorie 0x0000 – Prozess & Threads

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0000 sys_version (major«32)|minor ABI-Version; sollte beim Programmstart geprüft werden
0x0001 sys_exit code Beendet aktuellen Thread; kehrt nie zurück
0x0002 sys_exit_group code Beendet alle Threads der Prozessgruppe; kehrt nie zurück
0x0003 sys_spawn dir_fd, path, argv, envp, SpawnOpts* Prozess-fd Neuer Prozess aus ELF-Binary; kein fork()
0x0004 sys_thread_spawn entry, stack, stack_size, arg Thread-fd Neuer Thread im selben Adressraum
0x0005 sys_thread_exit code Beendet aktuellen Thread; kehrt nie zurück
0x0006 sys_wait proc_fd, status_out*, timeout_ns Wartet auf Prozess/Thread-Ende; -1 = unbegrenzt
0x0007 sys_getpid PID Prozess-ID
0x0008 sys_gettid TID Thread-ID
0x0009 sys_yield CPU freiwillig abgeben
0x000A sys_sleep_ns nanoseconds Schläft mindestens N Nanosekunden
0x000B sys_priority fd, priority Scheduling-Priorität setzen (0=normal, <0=höher)
0x000C sys_getrandom buf, len, flags Bytes Kryptographisch sicherer Zufall
0x000D sys_signal_mask notify_fd, mask vorherige Maske Asynchrone Benachrichtigungen maskieren

Kategorie 0x0100 – Speicher

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0100 sys_mmap hint, size, prot, flags Adresse Speicher-Mapping; hint=0 → Kernel wählt Adresse
0x0101 sys_munmap addr, size Mapping freigeben
0x0102 sys_mprotect addr, size, prot Schutzflags ändern
0x0103 sys_madvise addr, size, advice Hinweise an VMM (MADV_SEQUENTIAL usw.)
0x0104 sys_shm_create size, flags shm-fd Shared-Memory-Objekt erzeugen
0x0105 sys_shm_map shm_fd, offset, size, prot Adresse Shared Memory in Adressraum einblenden

con PROT_NONE  : int64 := 0
con PROT_READ  : int64 := 1
con PROT_WRITE : int64 := 2
con PROT_EXEC  : int64 := 4

con MAP_PRIVATE   : int64 := 1
con MAP_SHARED    : int64 := 2
con MAP_ANONYMOUS : int64 := 4
con MAP_FIXED     : int64 := 8
con MAP_POPULATE  : int64 := 16

Kategorie 0x0200 – Dateisystem & VFS

Alle Pfad-Syscalls nehmen dir_fd als erstes Argument. AT_CWD = -1 ist der Default. CLOEXEC ist implizit; O_INHERIT deaktiviert es.

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0200 sys_open dir_fd, path, flags, mode fd Datei öffnen oder anlegen
0x0201 sys_close fd fd schließen
0x0202 sys_read fd, buf, count Bytes gelesen Bis zu count Bytes lesen
0x0203 sys_write fd, buf, count Bytes geschrieben Bis zu count Bytes schreiben
0x0204 sys_seek fd, offset, whence neue Position Cursor setzen (SEEK_SET=0, SEEK_CUR=1, SEEK_END=2)
0x0205 sys_stat dir_fd, path, Stat*, flags Datei-Metadaten lesen
0x0206 sys_fstat fd, Stat* stat auf bereits offenem fd
0x0207 sys_mkdir dir_fd, path, mode Verzeichnis anlegen
0x0208 sys_unlink dir_fd, path, flags Datei löschen; UNLINK_DIR=1rmdir
0x0209 sys_rename old_dir, old_path, new_dir, new_path Atomares Umbenennen
0x020A sys_readdir fd, buf, buf_size Bytes Verzeichniseinträge lesen (DirEntry-Array)
0x020B sys_dup fd, flags neuer fd fd duplizieren
0x020C sys_pipe read_fd*, write_fd*, flags Unidirektionales Byte-Pipe-Paar
0x020D sys_truncate fd, size Dateigröße setzen
0x020E sys_sync fd Puffer auf Datenträger schreiben
0x020F sys_mount dev_fd, mnt_dir, path, fs_type, flags Dateisystem einhängen
0x0210 sys_umount dir_fd, path, flags Dateisystem aushängen
0x0211 sys_getcwd buf, size Bytes Aktuelles Arbeitsverzeichnis
0x0212 sys_chdir dir_fd, path Arbeitsverzeichnis wechseln
0x0213 sys_symlink target, dir_fd, link_path Symbolischen Link erzeugen
0x0214 sys_readlink dir_fd, path, buf, size Bytes Link-Ziel lesen
0x0215 sys_content_id fd, algo, out, out_len Hash-Bytes Kryptographischer Content-Hash (BLAKE3 oder SHA-256)

con O_READ      : int64 := 1
con O_WRITE     : int64 := 2
con O_RDWR      : int64 := 3
con O_CREAT     : int64 := 4
con O_EXCL      : int64 := 8
con O_TRUNC     : int64 := 16
con O_APPEND    : int64 := 32
con O_NONBLOCK  : int64 := 64
con O_INHERIT   : int64 := 128
con O_DIRECTORY : int64 := 256
con O_TMPFILE   : int64 := 512
con O_SEMANTIC  : int64 := 1024   // Beim Close: async Embedding + Graph-Node-Eintrag (WP18)

Kategorie 0x0300 – I/O & Geräte

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0300 sys_poll PollEvent*, count, timeout_ns bereite fds Mehrere fds gleichzeitig beobachten
0x0301 sys_ioctl fd, request, arg gerätespezifisch Gerätespezifische Steuerbefehle
0x0302 sys_mmap_device fd, offset, size, prot Adresse MMIO-Register in Adressraum mappen
0x0303 sys_irq_bind irq, notify_fd IRQ an Notification-fd binden (Userspace-Treiber)
0x0304 sys_port_in port, width Wert x86 IN-Befehl (erfordert CAP_IOPORT)
0x0305 sys_port_out port, width, value x86 OUT-Befehl (erfordert CAP_IOPORT)

Kategorie 0x0400 – IPC & Synchronisation

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0400 sys_mutex_create flags Mutex-fd Kernel-Mutex (MUTEX_PLAIN/RECURSIVE/ROBUST)
0x0401 sys_mutex_lock fd, timeout_ns Mutex sperren
0x0402 sys_mutex_unlock fd Mutex entsperren
0x0403 sys_sem_create initial, flags Semaphor-fd Zählsemaphor
0x0404 sys_sem_wait fd, timeout_ns Semaphor dekrementieren
0x0405 sys_sem_post fd Semaphor inkrementieren
0x0406 sys_channel_create flags (send«32)|recv Bidirektionaler Nachrichten-Kanal (Mach-Port-Stil)
0x0407 sys_channel_send fd, msg, size, fds*, count Nachricht + optionale fds senden
0x0408 sys_channel_recv fd, msg, size, fds*, count* Bytes Nachricht + fds empfangen
0x0409 sys_notify_create flags Notify-fd Asynchrone Notification-Queue (Unix-Signal-Ersatz)
0x040A sys_notify_wait fd, Notification*, count, timeout_ns Events Ausstehende Notifications lesen
0x040B sys_notify_post fd, type, data Notification in Queue schreiben
0x040C sys_futex addr*, op, val, timeout_ns, addr2*, val3 Fast Userspace Mutex (für Laufzeit-Implementierungen)

Kategorie 0x0500 – Zeit

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0500 sys_clock_get clock_id, TimeSpec* Nanosekunden Systemuhr lesen
0x0501 sys_clock_set clock_id, TimeSpec* Systemuhr setzen (Admin-Capability erforderlich)
0x0502 sys_timer_create clock_id, notify_fd, flags Timer-fd Periodischen/einmaligen Timer erzeugen
0x0503 sys_timer_set fd, interval_ns, initial_ns Timer aktivieren / deaktivieren (0/0 = disarm)
0x0504 sys_timer_wait fd, timeout_ns abgelaufene Ticks Bis zum nächsten Timer-Ablauf warten

con CLOCK_REAL   : int64 := 0
con CLOCK_MONO   : int64 := 1
con CLOCK_CPU    : int64 := 2
con CLOCK_THREAD : int64 := 3

Kategorie 0x0600 – Netzwerk

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0600 sys_socket domain, type, proto Socket-fd Socket erzeugen
0x0601 sys_bind fd, addr*, addr_len Socket an lokale Adresse binden
0x0602 sys_listen fd, backlog TCP-Socket in Wartezustand versetzen
0x0603 sys_accept fd, addr_out*, len* Client-fd Eingehende Verbindung akzeptieren
0x0604 sys_connect fd, addr*, addr_len Verbindung herstellen
0x0605 sys_sendmsg fd, MsgHdr*, flags Bytes Daten mit Scatter/Gather senden
0x0606 sys_recvmsg fd, MsgHdr*, flags Bytes Daten empfangen
0x0607 sys_setsockopt fd, level, opt, val*, len Socket-Option setzen
0x0608 sys_getsockopt fd, level, opt, val*, len* Socket-Option lesen
0x0609 sys_shutdown fd, how Socket-Verbindung (teil-)schließen

Kategorie 0x0700 – Sicherheit & Capabilities

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0700 sys_cap_create resource_fd, rights Capability-fd Capability für fd erzeugen
0x0701 sys_cap_restrict cap_fd, rights eingeschränkter fd Rechte reduzieren (nie erweitern)
0x0702 sys_cap_rights cap_fd Rechte-Bitmask Aktuelle Rechte abfragen
0x0703 sys_pledge promises, exec_promises Erlaubte Syscall-Klassen dauerhaft einschränken
0x0704 sys_unveil path, permissions Sichtbaren Dateisystem-Baum einschränken
0x0705 sys_uid_get UID User-ID abfragen
0x0706 sys_gid_get GID Gruppen-ID abfragen
0x0707 sys_setuid uid User-ID ändern (Admin-Capability erforderlich)
0x0708 sys_seccomp mode, BpfProg* BPF-Syscall-Filter installieren

con RIGHT_READ    : int64 := 1
con RIGHT_WRITE   : int64 := 2
con RIGHT_EXEC    : int64 := 4
con RIGHT_MMAP    : int64 := 8
con RIGHT_SEEK    : int64 := 16
con RIGHT_STAT    : int64 := 32
con RIGHT_DELETE  : int64 := 64
con RIGHT_CONTROL : int64 := 128
con RIGHT_ALL     : int64 := 0x7FFFFFFFFFFFFFFF

Kategorie 0x0800 – KI & Semantik

KI-Modelle sind Kernel-verwaltete Ressourcen. Das gesamte KI-Subsystem ist ein ladbares Kernel-Modul (kernel/ai.lyx). Wenn es nicht geladen ist, geben alle 0x0800-Syscalls ERR_NOTSUP zurück.

Modell & Kontext:

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0800 sys_ai_model_load dir_fd, path, flags Model-fd KI-Modell laden (GGUF, SafeTensors); Weights OS-weit geteilt
0x0801 sys_ai_model_unload model_fd Modell freigeben wenn alle Contexts geschlossen
0x0802 sys_ai_model_info model_fd, AiModelInfo* Metadaten lesen (Name, Architektur, Parameter, Context-Größe)
0x0803 sys_ai_ctx_create model_fd, ctx_size, flags Context-fd Inferenz-Kontext (KV-Cache) erzeugen
0x0804 sys_ai_ctx_destroy ctx_fd KV-Cache freigeben
0x0813 sys_ai_ctx_save ctx_fd, dir_fd, path KV-Cache als IOFS-Page-Cluster persistieren (sitzungsübergreifend)
0x0814 sys_ai_ctx_restore model_fd, dir_fd, path Context-fd Gespeicherten KV-Cache laden; Modell muss identisch sein
0x0816 sys_ai_model_pin model_fd Modell-Weights aus Swap-System sperren (nie kalt werden)
0x0817 sys_ai_model_unpin model_fd Modell wieder für Swap freigeben

Inferenz:

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x0805 sys_ai_infer ctx_fd, prompt_fd, result_fd, AiInferOpts* Job-fd Asynchrone Inferenz; Abschluss via NOTIFY_AI_DONE auf Job-fd
0x0806 sys_ai_infer_sync ctx_fd, prompt, len, result, max, AiInferOpts* Bytes Synchrone Inferenz; blockiert den Thread
0x0815 sys_ai_cancel job_fd Laufende asynchrone Inferenz abbrechen; schreibt NOTIFY_AI_CANCELED
0x0818 sys_ai_batch_infer ctx_fd, prompts_fd, count, results_fd, AiInferOpts* Batch-Job-fd Mehrere Prompts als GPU-Batch; erhöht Durchsatz drastisch

Sprachverarbeitung & Klassifikation:

Nr Name Argumente Rückgabe (rdx) Beschreibung
0x081B sys_ai_classify