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
Lyx OS nutzt ausschließlich die SYSCALL/SYSRET-Instruktion (AMD64 Fast Syscall). Es gibt keine Int-80-Kompatibilität und kein Vsyscall-Interface.
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
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;
}
; 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 | 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) |
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
// 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
| 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 |
| 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
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=1 → rmdir |
| 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)
| 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) |
| 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) |
| 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
| 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 |
| 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
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 |