====== 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.
→ [[lyxos:anwendungen|Anwendungen entwickeln]] · [[lyxos:architektur|Architektur]] · [[lyxos:start|Ü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(StrConcat("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 (geplante ABI) =====
> **Dieser Abschnitt beschreibt die geplante Ziel-ABI**, nicht den aktuellen Kernel. Die hex-gruppierten Nummern und ein Großteil der hier gelisteten Syscalls sind noch nicht implementiert.
> Der tatsächlich verfügbare Stand steht in [[#8_implementierter_ring-3_abi_aktueller_stand|Abschnitt 8]] — dort ist die Nummerierung flach und aus ''kernel/ring3.lyx'' abgeglichen.
==== 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=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)
==== 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'' | ''model_fd, text, len, labels**, count, scores_out*'' | Index des Labels | Schnelle Klassifikation ohne Textgenerierung (Intent-Klassifikation) |
| 0x081C | ''sys_ai_speech_to_text'' | ''model_fd, audio_fd, sample_rate, result_fd, AiInferOpts*'' | STT-Job-fd | Audio (PCM-S16LE) → UTF-8-Text; Basis für Lyras Spracheingabe |
| 0x081D | ''sys_ai_text_to_speech'' | ''model_fd, text, len, audio_fd, sample_rate_out*'' | TTS-Job-fd | Text → PCM-S16LE-Samples; Basis für Lyras Sprachausgabe |
**LoRA-Adapter:**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0819 | ''sys_ai_adapter_load'' | ''model_fd, dir_fd, path, flags'' | Adapter-fd | LoRA-Adapter laden und aktivieren; ''ADAPTER_MERGE=1'' bäckt Gewichte ein |
| 0x081A | ''sys_ai_adapter_unload'' | ''adapter_fd'' | — | LoRA-Adapter entfernen |
**Embeddings & Vektorindex:**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0807 | ''sys_ai_embed'' | ''ctx_fd, text, len, f32*, dim*'' | — | Embedding-Vektor erzeugen |
| 0x0808 | ''sys_ai_token_count'' | ''ctx_fd, text, len'' | Token-Anzahl | Tokens zählen ohne Inferenz |
| 0x0809 | ''sys_ai_search'' | ''index_fd, f32*, dim, k, AiSearchResult*, max'' | Treffer | k-Nearest-Neighbor-Suche im Kernel-Vektorindex |
| 0x080A | ''sys_ai_index_create'' | ''dim, flags'' | Index-fd | Kernel-Vektorindex erzeugen |
| 0x080B | ''sys_ai_index_insert'' | ''index_fd, id, f32*, dim, meta*, len'' | — | Vektor in Index einfügen |
| 0x080C | ''sys_ai_index_delete'' | ''index_fd, id'' | — | Vektoreintrag entfernen |
**Semantisches Paging:**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x080D | ''sys_sem_annotate'' | ''addr, size, embed_fd'' | — | Embedding an Speicherregion binden; VMM nutzt es für semantisches Swapping |
| 0x080E | ''sys_sem_query'' | ''f32*, dim, k, SemMemResult*, max'' | Treffer | Speicherregionen semantisch suchen |
**Wissensgraph:**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x080F | ''sys_graph_node_create'' | ''fd, flags'' | Node-ID | fd als Knoten im Kernel-Wissensgraphen registrieren |
| 0x0810 | ''sys_graph_edge_add'' | ''src, rel_type, dst, meta*, len'' | Edge-ID | Gerichtete Kante zwischen Graph-Knoten erzeugen |
| 0x0811 | ''sys_graph_edge_remove'' | ''edge_id'' | — | Graph-Kante entfernen |
| 0x0812 | ''sys_graph_query'' | ''node_id, rel_type, depth, GraphQueryResult*, max'' | Treffer | Wissensgraph traversieren |
| 0x081E | ''sys_graph_node_info'' | ''node_id, GraphNodeInfo*'' | — | Metadaten eines einzelnen Knotens lesen |
| 0x081F | ''sys_graph_node_delete'' | ''node_id, flags'' | — | Knoten löschen; ''NODE_DELETE_CASCADE=1'' entfernt auch alle Kanten |
==== Kategorie 0x0900 – Lyra Agent Interface ====
Nur für Prozesse mit ''"lyra"''-Pledge. Normale Anwendungen kommunizieren mit Lyra über ''sys_channel_*''.
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0900 | ''sys_intent_submit'' | ''text, len, priority'' | Intent-ID | Natürlichsprachlichen Intent an Lyra übermitteln |
| 0x0901 | ''sys_intent_wait'' | ''intent_id, timeout_ns, result_fd'' | Status | Auf Intent-Auflösung warten |
| 0x0902 | ''sys_intent_cancel'' | ''intent_id'' | — | Laufenden Intent abbrechen |
| 0x0903 | ''sys_lyra_event'' | ''event_type, data*, len'' | — | Sensorisches Event senden (Sprache, Geste, ...) |
| 0x0904 | ''sys_dream_register'' | ''fn_fd, interval_ns, flags'' | Dream-ID | Callback in CPU-Idle-Zyklen registrieren ("Dreaming AI") |
| 0x0905 | ''sys_dream_unregister'' | ''dream_id'' | — | Dream-Callback entfernen |
| 0x0906 | ''sys_memory_store'' | ''key, val*, len, flags'' | — | Eintrag in Lyras episodischen Ringpuffer schreiben |
| 0x0907 | ''sys_memory_recall'' | ''key, buf*, size'' | Bytes | Eintrag aus episodischem Speicher lesen |
| 0x0908 | ''sys_memory_search'' | ''f32*, dim, k, MemoryResult*, max'' | Treffer | Semantische Suche im episodischen Speicher |
| 0x0909 | ''sys_context_push'' | ''frame*, len'' | — | Kontext-Frame auf Lyras Kernel-Stack schieben |
| 0x090A | ''sys_context_pop'' | — | — | Obersten Kontext-Frame entfernen |
| 0x090B | ''sys_timeline_query'' | ''from_ns, to_ns, f32*, dim, TimelineResult*, max'' | Treffer | Ereignisse im Zeitfenster semantisch suchen |
| 0x090C | ''sys_lyra_announce'' | ''text, len, icon_fd, duration_ns, flags'' | Announce-ID | Lyra-Statusmeldung anzeigen ("Ich fülle das Formular aus...") |
| 0x090D | ''sys_lyra_confirm'' | ''action_desc, len, LyraConfirmOpts*, timeout_ns'' | ''CONFIRM_YES/NO/TIMEOUT'' | **Consent-Gate:** User muss destruktive Aktion kernel-seitig bestätigen |
| 0x090E | ''sys_lyra_highlight'' | ''win_fd, node_id, color, duration_ns'' | — | UI-Element optisch hervorheben (Lyra zeigt was sie bearbeitet) |
| 0x090F | ''sys_lyra_cursor'' | ''shape, win_fd'' | — | KI-Cursor-Stil setzen; ''CURSOR_AI_ACTIVE=10'' signalisiert Lyra-Steuerung |
==== Kategorie 0x0A00 – Debug & Telemetrie ====
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0A00 | ''sys_debug_print'' | ''msg, len'' | — | Kernel-Debug-Ausgabe (COM1); No-Op in Release-Builds |
| 0x0A01 | ''sys_trace_event'' | ''event_id, data*, len'' | — | Trace-Event in Kernel-Ringpuffer |
| 0x0A02 | ''sys_perf_counter'' | ''counter_id'' | Wert | Hardware-Performance-Counter (RDPMC) |
| 0x0A03 | ''sys_stack_trace'' | ''buf*, size'' | Frame-Anzahl | Aktuelle Rücksprungadressen in Puffer schreiben |
| 0x0A04 | ''sys_watchpoint_set'' | ''addr*, size, flags'' | Watchpoint-ID | Hardware-Watchpoint setzen (DR0–DR3) |
| 0x0A05 | ''sys_watchpoint_clear'' | ''wp_id'' | — | Hardware-Watchpoint löschen |
==== Kategorie 0x0B00 – Task & Automatische Parallelität ====
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0B00 | ''sys_task_spawn'' | ''fn*, arg*, arg_size, flags'' | Task-fd | Leichtgewichtigen Task starten; Kernel wählt Core (Work-Stealing) |
| 0x0B01 | ''sys_task_await'' | ''task_fd, result*, size, timeout_ns'' | Bytes | Auf Task-Abschluss warten |
| 0x0B02 | ''sys_task_cancel'' | ''task_fd'' | — | Task abbrechen |
| 0x0B03 | ''sys_task_group_create'' | ''flags'' | group_fd | Task-Gruppe erzeugen |
| 0x0B04 | ''sys_task_group_add'' | ''group_fd, fn*, arg*, size'' | Task-fd | Task zur Gruppe hinzufügen |
| 0x0B05 | ''sys_task_group_await'' | ''group_fd, timeout_ns'' | abgeschl. Tasks | Auf alle Tasks der Gruppe warten |
| 0x0B06 | ''sys_cpu_count'' | — | CPU-Anzahl | Anzahl logischer Kerne |
| 0x0B07 | ''sys_cpu_topology'' | ''CpuTopology*, size'' | — | CPU-Topologie lesen (Cores, Sockets, NUMA) |
| 0x0B08 | ''sys_affinity_hint'' | ''fd, cpu_mask'' | — | Weicher Core-Präferenz-Hinweis (kein Mandat) |
| 0x0B09 | ''sys_numa_alloc'' | ''size, node_hint, prot'' | Adresse | Speicher bevorzugt auf NUMA-Node allozieren |
con TASK_DETACHED : int64 := 1
con TASK_CPU_INTENSIVE : int64 := 2
con TASK_IO_INTENSIVE : int64 := 4
con TASK_LATENCY_SENSITIVE : int64 := 8
con TASK_INHERIT_CAPS : int64 := 16
==== Kategorie 0x0C00 – IOFS ====
Niedrig-Level-Zugang zum [[lyxos:iofs|Island & Ocean File System (IOFS)]]. Normale Anwendungen nutzen das VFS-Interface.
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0C00 | ''sys_iofs_mount'' | ''dev_fd, IofsOpts*'' | mount_fd | Raw-Block-Device als IOFS einbinden |
| 0x0C01 | ''sys_iofs_compact'' | ''mount_fd, region_hint'' | Pages | Manuellen Kompaktierungszyklus auslösen |
| 0x0C02 | ''sys_iofs_page_info'' | ''mount_fd, page_id, IofsPageInfo*'' | — | IOFS-Page-Header und Metadaten lesen |
| 0x0C03 | ''sys_iofs_sandbox_enter'' | ''mount_fd'' | — | Panic-Sandbox aktivieren (CAP_ADMIN erforderlich) |
| 0x0C04 | ''sys_iofs_sandbox_exit'' | — | — | Panic-Sandbox verlassen |
==== Kategorie 0x0D00 – Display, Fenster & Eingabe ====
Lyx OS kennt keinen Display-Server und kein Protokoll-Socket (kein X11, kein Wayland). Der Kernel verwaltet Display-Hardware, Surface-Puffer, VSync-Signale und Eingabe-Streams direkt als fd-Objekte. **Lyra** übernimmt als privilegierter Compositor-Prozess alle Layout- und Z-Order-Entscheidungen. Erfordert ''"display"''-Pledge.
**Display-Verwaltung (0x0D00–0x0D02):**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0D00 | ''sys_display_open'' | ''display_id, flags'' | Display-fd | Display-Gerät öffnen; ''display_id=0'' = primäres Display |
| 0x0D01 | ''sys_display_info'' | ''display_fd, DisplayInfo*'' | — | Auflösung, Refresh-Rate, DPI, Pixel-Format, Flags lesen |
| 0x0D02 | ''sys_display_list'' | ''ids_out*, max'' | Anzahl | Alle verfügbaren Display-IDs auflisten (Multi-Monitor) |
**Surface-Verwaltung (0x0D03–0x0D07):**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0D03 | ''sys_surface_create'' | ''display_fd, width, height, format, flags'' | Surface-fd | GPU-zugänglichen Pixel-Puffer anlegen; ''SURF_DOUBLE_BUFFER=4'' |
| 0x0D04 | ''sys_surface_map'' | ''surface_fd'' | Pixel-Adresse | Back-Buffer als beschreibbare Seiten in Adressraum mappen (CPU-Drawing) |
| 0x0D05 | ''sys_surface_unmap'' | ''surface_fd'' | — | CPU-Mapping aufheben; Surface bleibt erhalten |
| 0x0D06 | ''sys_surface_present'' | ''surface_fd, win_fd, DamageRect*, count'' | Frame-ID | Surface an Compositor übergeben; schreibt ''NOTIFY_VSYNC'' wenn Frame erscheint |
| 0x0D07 | ''sys_vsync_wait'' | ''display_fd, timeout_ns'' | Frame-ID | Bis zum nächsten VSync blockieren |
**Fenster-Verwaltung (0x0D08–0x0D0E):**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0D08 | ''sys_window_create'' | ''display_fd, title, WindowOpts*'' | Win-fd | Fenster beim Compositor anfordern; schreibt ''NOTIFY_WIN_*'' |
| 0x0D09 | ''sys_window_resize'' | ''win_fd, width, height'' | — | Größenwunsch an Compositor; bei ''WIN_LYRA_MANAGED'' ignorierbar |
| 0x0D0A | ''sys_window_move'' | ''win_fd, x, y'' | — | Positionswunsch an Compositor |
| 0x0D0B | ''sys_window_show'' | ''win_fd, mode'' | — | Sichtbarkeitsstatus: ''WIN_SHOW/HIDE/MINIMIZE/MAXIMIZE/FULLSCREEN/RESTORE'' |
| 0x0D0C | ''sys_window_destroy'' | ''win_fd'' | — | Fenster entfernen; schreibt ''NOTIFY_WIN_CLOSE'' vor Ungültigwerden |
| 0x0D0D | ''sys_window_title'' | ''win_fd, title'' | — | Fenstertitel ändern (Lyra wertet ihn semantisch aus) |
| 0x0D0E | ''sys_window_surface'' | ''win_fd'' | Surface-fd | Surface-fd des Fensters abfragen |
**Eingabe (0x0D0F–0x0D10):**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0D0F | ''sys_input_open'' | ''device_type, flags'' | Input-fd | Eingabekanal öffnen (''INPUT_KEYBOARD/MOUSE/TOUCH/STYLUS/GAMEPAD'') |
| 0x0D10 | ''sys_input_read'' | ''input_fd, InputEvent*, max'' | Events | Bis zu ''max'' Eingabeereignisse lesen |
**GPU-Beschleunigung (0x0D11–0x0D12):**
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0D11 | ''sys_gpu_submit'' | ''surface_fd, cmds*, len'' | Fence-ID | GPU-Command-Buffer zur Ausführung einreichen |
| 0x0D12 | ''sys_gpu_fence_wait'' | ''fence_id, timeout_ns'' | — | Warten bis GPU Command-Buffer abgearbeitet hat |
con PIX_ARGB8888 : int64 := 1 // 32-bit: Alpha/R/G/B je 8 Bit (Standard)
con PIX_XRGB8888 : int64 := 2 // 32-bit: kein Alpha
con PIX_RGB565 : int64 := 3 // 16-bit (Embedded-Displays)
con PIX_A8 : int64 := 4 // 8-bit Alpha only (Masken)
con SURF_GPU_READABLE : int64 := 1
con SURF_GPU_WRITABLE : int64 := 2
con SURF_DOUBLE_BUFFER : int64 := 4
con WIN_SHOW : int64 := 0
con WIN_HIDE : int64 := 1
con WIN_MINIMIZE : int64 := 2
con WIN_MAXIMIZE : int64 := 3
con WIN_FULLSCREEN : int64 := 4
con WIN_RESTORE : int64 := 5
con WIN_RESIZABLE : int64 := 1
con WIN_BORDERLESS : int64 := 2
con WIN_TRANSPARENT : int64 := 4
con WIN_ALWAYS_TOP : int64 := 8
con WIN_LYRA_MANAGED : int64 := 16 // Lyra entscheidet Position/Größe
con WIN_NO_SHADOW : int64 := 32 // Kein Schatten durch Compositor
con DISP_HDR : int64 := 1 // Display unterstützt High Dynamic Range
con DISP_TOUCH : int64 := 2 // Touch-Display (integriert)
con DISP_PRIMARY : int64 := 4 // Primäres Display
con DISP_EXTERNAL : int64 := 8 // Extern angeschlossen (HDMI, DP, USB-C)
con INPUT_KEYBOARD : int64 := 1
con INPUT_MOUSE : int64 := 2
con INPUT_TOUCH : int64 := 3
con INPUT_STYLUS : int64 := 4
con INPUT_GAMEPAD : int64 := 5
con EV_KEY_PRESS : int64 := 1
con EV_KEY_RELEASE : int64 := 2
con EV_MOUSE_MOVE : int64 := 3
con EV_MOUSE_BUTTON : int64 := 4
con EV_MOUSE_SCROLL : int64 := 5
con EV_TOUCH_DOWN : int64 := 6
con EV_TOUCH_MOVE : int64 := 7
con EV_TOUCH_UP : int64 := 8
==== Kategorie 0x0D13 – Lyra als GUI-Akteur ====
Wenn Lyra auf der Oberfläche handelt, braucht sie drei Fähigkeiten: **Sehen** (Bildschirm-Snapshot für Vision-AI), **Verstehen** (Accessibility-Baum — nicht Pixel, sondern "Das ist ein Submit-Button") und **Handeln** (synthetische Events einschleusen, Overlays rendern).
**Consent-Gate:** Für destruktive Aktionen (Löschen, Senden, Kaufen) muss Lyra ''sys_lyra_confirm'' aufrufen. Der User muss explizit bestätigen — kernel-seitig erzwungen, nicht umgehbar. Alle Lyra-UI-Aktionen schreiben automatisch einen Audit-''trace_event''.
**Agency-Kennzeichnung:** Jeder synthetische Input via ''sys_input_inject'' trägt ''EV_SOURCE_AI=0x8000'' im ''modifiers''-Feld — Anwendungen können Lyra-Input von User-Input unterscheiden.
^ Nr ^ Name ^ Argumente ^ Rückgabe (rdx) ^ Beschreibung ^
| 0x0D13 | ''sys_window_list'' | ''out*, max'' | Anzahl | Alle sichtbaren Fenster nach Z-Order auflisten |
| 0x0D14 | ''sys_window_info'' | ''win_fd, WindowInfo*'' | — | Titel, Bounds, Owner-PID, Fokus-Status eines Fensters lesen |
| 0x0D15 | ''sys_window_focus'' | ''win_fd'' | — | Eingabefokus setzen; Vorbedingung für ''sys_input_inject'' |
| 0x0D16 | ''sys_input_inject'' | ''win_fd, InputEvent*, count'' | — | Synthetische Eingabe einschleusen; setzt ''EV_SOURCE_AI'' im ''modifiers''-Feld |
| 0x0D17 | ''sys_display_snapshot'' | ''display_fd, surface_fd, flags'' | — | Komponierten Bildschirm in Surface rendern (Eingabe für Vision-AI) |
| 0x0D18 | ''sys_window_snapshot'' | ''win_fd, surface_fd, flags'' | — | Einzelnes Fenster snapshotten — auch wenn teilweise verdeckt |
| 0x0D19 | ''sys_overlay_create'' | ''win_fd, x, y, width, height, flags'' | Overlay-fd | Transparentes Overlay über Fenster; ''OVL_CLICK_THROUGH=1'', ''OVL_HIGHLIGHT=2'' |
| 0x0D1A | ''sys_overlay_destroy'' | ''overlay_fd'' | — | Overlay entfernen |
| 0x0D1B | ''sys_acc_tree'' | ''win_fd, buf*, size'' | Bytes | Accessibility-Baum lesen (Array von ''AccNode''); Lyra-native Apps exportieren ihn automatisch |
| 0x0D1C | ''sys_acc_action'' | ''win_fd, node_id, action, data*, len'' | — | Aktion auf UI-Element: ''ACC_CLICK/FOCUS/SET_VALUE/SCROLL/EXPAND/COLLAPSE'' |
| 0x0D1D | ''sys_acc_subscribe'' | ''win_fd, notify_fd'' | — | ''NOTIFY_ACC_CHANGED'' abonnieren wenn sich der Accessibility-Baum ändert |
con EV_SOURCE_USER : int64 := 0x0000 // Physischer User-Input
con EV_SOURCE_AI : int64 := 0x8000 // Lyra-injizierter synthetischer Input
con OVL_CLICK_THROUGH : int64 := 1 // Mausevents gehen ans Zielfenster durch
con OVL_HIGHLIGHT : int64 := 2 // Vordefinierter Highlight-Effekt
con OVL_ALWAYS_TOP : int64 := 4
con ACC_CLICK : int64 := 1
con ACC_FOCUS : int64 := 2
con ACC_SET_VALUE : int64 := 3
con ACC_SCROLL : int64 := 4
con ACC_EXPAND : int64 := 5
con ACC_COLLAPSE : int64 := 6
con SNAP_CURSOR : int64 := 1
con SNAP_NOCURSOR : int64 := 2
con SNAP_HDR : int64 := 4
con ACC_TYPE_BUTTON : int64 := 1
con ACC_TYPE_INPUT : int64 := 2 // Einzeiliges Textfeld
con ACC_TYPE_TEXTAREA : int64 := 3 // Mehrzeiliges Textfeld
con ACC_TYPE_LABEL : int64 := 4
con ACC_TYPE_LINK : int64 := 5
con ACC_TYPE_IMAGE : int64 := 6
con ACC_TYPE_CHECKBOX : int64 := 7
con ACC_TYPE_RADIO : int64 := 8
con ACC_TYPE_DROPDOWN : int64 := 9
con ACC_TYPE_SLIDER : int64 := 10
con ACC_TYPE_LIST : int64 := 11
con ACC_TYPE_LISTITEM : int64 := 12
con ACC_TYPE_MENU : int64 := 13
con ACC_TYPE_MENUITEM : int64 := 14
con ACC_TYPE_CONTAINER : int64 := 15 // Allgemeiner Container / Panel
con ACC_TYPE_PROGRESS : int64 := 16 // Fortschrittsbalken
con ACC_TYPE_CANVAS : int64 := 17 // Frei gezeichnete Fläche
----
===== 5. Übersicht aller Kategorien =====
^ Bereich ^ Kategorie ^ Syscall-Anzahl ^
| 0x0000–0x000D | Prozess & Threads | 14 |
| 0x0100–0x0105 | Speicher | 6 |
| 0x0200–0x0215 | Dateisystem & VFS | 22 |
| 0x0300–0x0305 | I/O & Geräte | 6 |
| 0x0400–0x040C | IPC & Synchronisation | 13 |
| 0x0500–0x0504 | Zeit | 5 |
| 0x0600–0x0609 | Netzwerk | 10 |
| 0x0700–0x0708 | Sicherheit & Capabilities | 9 |
| 0x0800–0x081F | KI & Semantik + Wissensgraph | 32 |
| 0x0900–0x090F | Lyra Agent Interface + native UI | 16 |
| 0x0A00–0x0A05 | Debug & Telemetrie | 6 |
| 0x0B00–0x0B09 | Task & Automatische Parallelität | 10 |
| 0x0C00–0x0C04 | IOFS | 5 |
| 0x0D00–0x0D1D | Display, Fenster, Eingabe & Lyra-GUI | 30 |
| **Gesamt** | | **184** |
Reservierte Bereiche: ''0x000E–0x00FF'', ''0x0106–0x01FF'', ''0x0216–0x02FF'', ''0x0813–0x08FF'', ''0x090C–0x09FF'', ''0x0A06–0x0AFF'', ''0x0B0A–0x0BFF'', ''0x0C05–0x0CFF'', ''0x0D1E–0x0DFF'' (Display-Erweiterungen), ''0x0E00–0xFFFF'' (zukünftige Kategorien).
----
===== 6. Notify-Typen =====
con NOTIFY_SIGNAL : int64 := 1 // Signal-ähnliches Event
con NOTIFY_CHILD_EXIT : int64 := 2 // Kind-Prozess beendet
con NOTIFY_TIMER : int64 := 3 // Timer abgelaufen
con NOTIFY_FD_READY : int64 := 4 // fd bereit (I/O)
con NOTIFY_AI_DONE : int64 := 5 // KI-Inferenz abgeschlossen
con NOTIFY_INTENT_DONE : int64 := 6 // Lyra-Intent aufgelöst
con NOTIFY_IRQ : int64 := 7 // Hardware-IRQ
con NOTIFY_WATCHPOINT : int64 := 8 // Hardware-Watchpoint ausgelöst
con NOTIFY_EMBED_DONE : int64 := 9 // Async-Embedding abgeschlossen
con NOTIFY_GRAPH_UPDATED: int64 := 10 // Wissensgraph-Kante hinzugefügt/entfernt
con NOTIFY_WIN_CLOSE : int64 := 11 // Benutzer hat Fenster geschlossen
con NOTIFY_WIN_RESIZE : int64 := 12 // Fenster wurde in der Größe verändert
con NOTIFY_WIN_FOCUS_IN: int64 := 13 // Fenster hat Eingabefokus erhalten
con NOTIFY_WIN_FOCUS_OUT: int64 := 14 // Fenster hat Eingabefokus verloren
con NOTIFY_VSYNC : int64 := 15 // Vertikaler Sync-Puls (Frame-ID in data)
con NOTIFY_INPUT_READY : int64 := 16 // Eingabeereignisse verfügbar
con NOTIFY_AI_CANCELED : int64 := 17 // KI-Inferenz-Job abgebrochen
con NOTIFY_ACC_CHANGED : int64 := 18 // Accessibility-Baum hat sich geändert
con NOTIFY_LYRA_CONFIRM: int64 := 19 // User hat auf sys_lyra_confirm geantwortet
----
===== 7. Pledge-Promises =====
''sys_pledge'' beschränkt dauerhaft die erlaubten Syscall-Klassen eines Prozesses. Einmal gesetzt, nie erweiterbar.
"stdio" – read/write/poll auf bestehenden fds
"rpath" – Dateisystem lesend öffnen/stat
"wpath" – Dateisystem schreibend öffnen
"cpath" – Dateien erzeugen/löschen
"exec" – sys_spawn
"net" – Socket-Syscalls (0x0600–0x0609)
"thread" – sys_thread_spawn
"memory" – sys_mmap / sys_mprotect
"device" – sys_ioctl, sys_port_in/out
"display" – Grafik-Syscalls (0x0D00–0x0DFF); erforderlich für Fenster & Compositor
"ai" – KI-Syscalls (0x0800–0x08FF)
"lyra" – Lyra-Syscalls (0x0900–0x09FF)
"admin" – privilegierte Syscalls (sys_mount, sys_setuid, ...)
----
===== 8. Implementierter Ring-3 ABI (aktueller Stand) =====
Der vorangehende Abschnitt beschreibt den **geplanten** Future-ABI mit hex-gruppierten Nummern. Dieser Abschnitt dokumentiert den **tatsächlich implementierten** Ring-3 Syscall-Stand in ''kernel/ring3.lyx'' (flaches Nummernschema 0–201). Stand inkl. Netzwerk-Roh-I/O (WP26, nr 141–147), IOFS-GC (WP07-GC, nr 179), TCP-Stack (WP16-TCP, nr 180–184; siehe [[lyxos:tcp|TCP-Stack]]) und Bildschirm-Übernahme (nr 106/107, siehe [[lyxos:vega#3_display-backend|Vega – Display-Backend]]).
==== Mechanismus ====
Ring-3-Prozesse rufen Syscalls via ''SYSCALL''-Instruction auf. Der Handler ''ring3_r3_deferred'' in ''bootloader/boot.asm'' speichert den Kontext im ''r3_sc_block'' (physisch-feste 4 KB-Seite):
r3_sc_block Layout (Byte-Offsets):
+0: nr — Syscall-Nummer (rax beim Eintritt)
+8: a0 — Argument 0 (rdi)
+16: a1 — Argument 1 (rsi)
+24: a2 — Argument 2 (rdx)
+32: a3 — Argument 3 (r10)
+40: result — Rückgabewert (Kernel → Ring-3, nach IRETQ in rdx)
+48: rsp3 — Ring-3 RSP
+56: rcx3 — Ring-3 RIP (= rcx nach SYSCALL)
+64: r11 — Ring-3 RFLAGS
+72: rbp3 — Ring-3 RBP
==== Rückgabe-Konvention ====
* Ring-3 liest das Ergebnis aus ''+40 (result)'' nach IRETQ in ''rdx''
* Fehler: ''result = -1''; Erfolg: ''result = Wert ≥ 0''
* Keine dedizierten ERR_*-Konstanten im aktuellen Kernel — nur -1 / ≥0
==== FD-Offset-Konvention ====
^ Ring-3-FD ^ Bedeutung ^
| 0 | Tastatur (stdin, blocking PS/2-Read) |
| 1 | stdout (vmm_op41 → COM1 + Framebuffer) |
| 2 | stderr (reserviert) |
| ≥ 3 | VFS-FD = Ring-3-FD − 3 |
==== Syscall-Tabelle (implementiert) ====
^ Nr ^ Name ^ Argumente (a0, a1, a2, a3) ^ Rückgabe ^ Beschreibung ^
| 0 | ''sys_read'' | ''fd, buf_uva, count'' | Bytes oder -1 | Lesen von fd. fd=0: blockierender PS/2-Tastatur-Read (1 Byte). fd≥3: VFS-Read. Bei Verzeichnis-FD: DirEntry-Array à 56 Byte. |
| 1 | ''sys_write'' (lyxc-Builtin: ''lyx_putchar'') | ''fd, char_byte, 1'' | 1 | Byte auf COM1 + GOP-Framebuffer (vmm_op41). Bei aktivem Child-Capture: Byte zusätzlich in SHM-Ringpuffer (+16). |
| 2 | ''sys_open'' | ''path_uva, flags, mode'' | r3fd+3 oder -1 | Datei im VFS öffnen. Rückgabe = VFS-fd+3. |
| 3 | ''sys_close'' | ''r3fd'' | 0 | VFS-FD schließen (''VfsClose(r3fd − 3)''). |
| 9 | ''sys_mmap'' | ''hint, size, prot, flags'' | user_virt | Virtuelle Seiten allozieren und in Prozess-PML4 mappen. Bump-Allokator ab USER_HEAP_BASE (0x10000000). |
| 24 | ''sys_yield'' | — | — | Asynchrones Yield: gibt Kontrolle vom Kind-Prozess an den Compositor zurück. Nicht durch handle_r3_syscall behandelt. |
| 79 | ''sys_getcwd'' | ''buf_phys, size'' | len+1 | Aktuelles Arbeitsverzeichnis in buf schreiben (VfsGetCwd). |
| 80 | ''sys_chdir'' | ''path_uva'' | 0 oder -1 | Arbeitsverzeichnis wechseln (VfsChdir). |
| 81 | ''sys_locale_info'' | ''buf_uva'' | Ergebnis | Locale-Zusammenfassung in Puffer schreiben (LocaleSummary). |
| 82 | ''sys_diskinfo'' | — | 0 | Festplatten-Info auf COM1 + Framebuffer ausgeben (VfsDiskPrintInfoR3). |
| 83 | ''sys_mkpart'' | ''disk_id, lba_start, sector_count'' | 0 oder -1 | MBR-Partitionseintrag anlegen (VfsMkPart). |
| 84 | ''sys_mkfat32'' | ''disk_id, lba_start, sector_count'' | 0 oder -1 | Partition als FAT32 formatieren (VfsMkFat32). |
| 85 | ''sys_mount'' | ''vol_id, disk_id, lba_start'' | 0 oder -1 | Festplatte als Volume mounten (VfsMountDisk). |
| 86 | ''sys_vol'' | ''vol_id'' | 0 oder -1 | Aktives VFS-Volume wechseln; CWD → "/" (VfsSwitchVolume). |
| 87 | ''sys_gpt'' | ''disk_id, vol_id_start'' | Anzahl oder -1 | GPT scannen, FAT32-Partitionen automatisch mounten + Infos ausgeben. |
| 88 | ''sys_partinfo'' | ''disk_id'' | 0 | Partitionstabelle mit freien Lücken ausgeben (VfsDiskMap). |
| 89 | ''sys_mkfat32_part'' | ''disk_id, part_no'' | 0 oder -1 | Partition ''part_no'' als FAT32 formatieren (VfsMkFat32ByPart). |
| 90 | ''sys_mount_part'' | ''vol_id, disk_id, part_no'' | 0 oder -1 | Partition ''part_no'' als ''vol_id'' mounten (VfsMountByPart). |
| 91 | ''sys_spawn_child'' | ''path_uva, argc, argv_phys'' | Exit-Code oder -1 | ELF-Binary als Kind-Prozess laden und **synchron** ausführen. Blockiert bis zum Abschluss. |
| 92 | ''sys_setenv'' | ''key_phys, val_phys'' | 0 | Umgebungsvariable setzen (VfsEnvSet). |
| 93 | ''sys_getenv'' | ''key_phys, buf_phys, size'' | Länge oder -1 | Umgebungsvariable lesen (VfsEnvGet). |
| 94 | ''sys_envlist'' | — | 0 | Alle Umgebungsvariablen auf COM1 + Framebuffer ausgeben (VfsEnvList). |
| 95 | ''sys_write'' | ''r3fd, buf_uva, count'' | Bytes oder -1 | In VFS-FD schreiben (VfsWrite). |
| 96 | ''sys_rename'' | ''old_path_uva, new_path_uva'' | 0 oder -1 | Datei/Verzeichnis umbenennen (VfsRename). |
| 97 | ''sys_unlink'' | ''path_uva'' | 0 oder -1 | Datei löschen (VfsUnlink). |
| 98 | ''sys_block_open'' | ''disk_id, flags'' | bfd+3 oder -1 | Rohes Block-Device öffnen (VfsBlockOpen). Rückgabe = Block-FD+3. |
| 99 | ''sys_block_read'' | ''bfd, lba, count, buf_uva'' | Ergebnis oder -1 | Sektoren von Block-Device in Benutzerpuffer lesen (VfsBlockRead). |
| 100 | ''sys_block_write'' | ''bfd, lba, count, buf_uva'' | Ergebnis oder -1 | Sektoren aus Benutzerpuffer auf Block-Device schreiben (VfsBlockWrite). |
| 101 | ''sys_block_info'' | ''bfd, out_uva'' | Ergebnis oder -1 | Block-Device-Info lesen: ''{sector_count(8), disk_id(8), 512(8)}'' (VfsBlockInfo). |
| 102 | ''sys_gpt_create'' | ''disk_id, nsectors, nparts, parts_uva'' | 0 oder -1 | GPT-Partitionstabelle anlegen. ''parts_uva'' → Array von ''{lba_start, lba_end}''-Paaren (VfsGptCreate). |
| 110 | ''sys_win_create'' | ''x, y, w, h'' | win_id oder -1 | Fenster anlegen, SHM-Framebuffer allozieren (w×h×4 Byte physisch kontiguös). |
| 111 | ''sys_win_destroy'' | ''win_id'' | 0 oder -1 | Fenster-Slot freigeben (WIN_OFF_STATE → 0). |
| 112 | ''sys_win_raise'' | ''win_id'' | 0 oder -1 | Fenster in den Vordergrund bringen (Z := max_Z + 1). |
| 113 | ''sys_win_move'' | ''win_id, x, y'' | 0 oder -1 | Fensterposition in der Fenster-Tabelle aktualisieren. |
| 114 | ''sys_win_resize'' | ''win_id, new_w, new_h'' | 0 oder -1 | Fenster-Metadaten aktualisieren (kein FB-Realloc). |
| 115 | ''sys_win_get_fb'' | ''win_id'' | user_virt oder -1 | Fenster-Framebuffer (SHM) in Prozess-PML4 mappen; liefert user-virtuelle Adresse. |
| 116 | ''sys_vsync_wait'' | — | 0 | Busy-wait bis PIT-Frame-Counter sich erhöht (~10 ms bei 100 Hz, vmm_op48). |
| 117 | ''sys_time_ns'' | — | Nanosekunden | Monotone Zeit in ns: PIT-Frame-Counter × 10.000.000. |
| 118 | ''sys_shm_create'' | ''size'' | shm_id (0–63) oder -1 | Physisch kontiguöse SHM-Seiten allozieren; liefert shm_id. |
| 119 | ''sys_shm_map'' | ''shm_id'' | user_virt oder -1 | SHM in Prozess-Adressraum mappen; Ref-Count erhöhen. |
| 120 | ''sys_shm_unmap'' | ''shm_id'' | 0 | Ref-Count verringern; Slot freigeben wenn Ref-Count = 0. |
| 121 | ''sys_event_send'' | ''pid, type, a, b'' | 0 | Event (32 Byte: type/a/b/c) in Ring-Puffer von ''pid'' schreiben. Max. 8 PIDs × 16 Slots. |
| 122 | ''sys_event_recv'' | ''out_buf_uva'' | 0 oder -1 | Ältestes Event für aktuelle PID lesen: ''{type(8), a(8), b(8), c(8)}''. |
| 124 | ''sys_set_console'' | ''pid, shm_id'' | 0 | PutCh-Ausgabe von ''pid'' in SHM-Ringpuffer umleiten. ''shm_id = -1'' → trennen. |
| 125 | ''sys_fb_map_user'' | ''fb_base, fb_width, fb_height, fb_stride'' | fb_phys | GOP-Framebuffer-Seiten user-zugänglich in Prozess-PML4 mappen (identity-map). |
| 126 | ''sys_get_mouse_x'' | — | X | PS/2-Maus X-Position (absolut, nach Bounds geclippt, vmm_op50). |
| 127 | ''sys_get_mouse_y'' | — | Y | PS/2-Maus Y-Position (vmm_op51). |
| 128 | ''sys_get_mouse_btn'' | — | Buttons | PS/2-Maus Tastenstand (vmm_op52). |
| 129 | ''sys_set_mouse_bounds'' | ''max_x, max_y'' | 0 | Maus-Koordinatengrenze setzen (vmm_op54/55). |
| 130 | ''sys_win_get_table_phys'' | — | phys | Physische Basisadresse der Fenster-Tabelle (Compositor-Direktzugriff). |
| 131 | ''sys_kbd_poll'' | — | char oder 0 | Non-blocking PS/2-Tastaturlesen (vmm_op28). 0 = keine Taste verfügbar. |
| 132 | ''sys_event_recv_pid'' | ''pid_idx, out_buf_uva'' | 0 oder -1 | Event für bestimmten PID-Slot lesen (für Compositor-seitige Abfrage fremder PIDs). |
| 133 | ''sys_envlistbuf'' | ''buf_uva, size'' | Bytes | Alle Env-Vars als ''KEY=VAL\n'' in Benutzerpuffer kopieren (VfsEnvListBuf). |
| 134 | ''sys_rtc_read'' | — | ''(Stunden<<8)%%|%%Minuten'' | RTC-Zeit lesen, binär, 24h (vmm_op61). |
| 135 | ''sys_fstat'' | ''r3fd, stat_uva'' | 0 oder -1 | Datei-Stat auf offenem FD: ''+0=Größe(8), +8=Typ(8; 0=Datei/1=Dir), +16=Cluster(8)''. |
| 136 | ''sys_getpid'' | — | PID | Aktuelle Scheduler-PID zurückgeben (vmm_op49). |
| 137 | ''sys_set_child_out'' | ''shm_id'' | 0 | SHM für Child-stdout-Capture registrieren. Capture aktiv während SysSpawnChild; -1 deaktiviert. |
| 138 | ''sys_rtc_datetime'' | — | ''(fat32_date<<16)%%|%%fat32_time'' | RTC als FAT32-Format lesen (vmm_op62). date: Bits[15:9]=Jahr−1980, [8:5]=Monat, [4:0]=Tag. time: Bits[15:11]=Stunden, [10:5]=Minuten, [4:0]=Sekunden/2. |
| 139 | ''sys_mkdir'' | ''path_uva'' | 0 oder -1 | Verzeichnis anlegen (VfsMkdirPath). |
| 140 | ''sys_utime_fd'' | ''r3fd, mtime'' | 0 | Mtime auf offenem FD setzen (VfsUtimeFd). ''mtime'' im FAT32-Format wie sys_rtc_datetime. |
| 141 | ''sys_net_get_ip'' | ''—'' | — | → assigned IP (packed BE), 0 = no lease |
| 142 | ''sys_net_get_gw'' | ''—'' | — | → default gateway IP |
| 143 | ''sys_net_get_mask'' | ''—'' | — | → subnet mask |
| 144 | ''sys_net_get_dns'' | ''—'' | — | → primary DNS server IP |
| 145 | ''sys_net_get_mac'' | ''uva_buf'' | — | copy 6 MAC bytes to user buffer |
| 146 | ''sys_net_send'' | ''uva_buf, len'' | — | send raw Ethernet frame |
| 147 | ''sys_net_recv'' | ''uva_buf, maxlen'' | — | receive one raw Ethernet frame (0 = no frame) |
| 150 | ''sys_win_get_title'' | ''win_id, out_uva'' | 0 oder -1 | Fenstertitel in Ring-3-Puffer (32 Bytes) kopieren (WP27). ''out_uva'' muss auf 32 Bytes zeigen. |
| 151 | ''sys_win_get_geom'' | ''win_id, out_uva'' | 0 oder -1 | Fenstergeometrie {x, y, w, h} als 4×int64 (32 Bytes) kopieren (WP29). |
| 152 | ''sys_win_get_pid'' | ''win_id'' | PID oder -1 | Owner-PID des Fensters abfragen (WP29). |
| 103 | ''sys_disk_id_range'' | ''out_uva'' | 0 / -1 | Welche Gerätenummern das System vergibt. Puffer 32 B: +0 Anzahl physischer Plätze, +8 erste RAM-Disk-Nummer, +16 Anzahl RAM-Disks, +24 Nummer des USB-Speichers. **Werkzeuge sollen die Bereiche hierüber erfragen, nicht abschreiben** |
| 106 | ''sys_vbe_takeover'' | ''w, h, bpp'' | Adresse des Bildspeichers oder -1 | Bildschirm von der Firmware übernehmen: Bochs-VBE-Modus in genau den Maßen des UEFI-Modus setzen, virtuelle Höhe = 2×h für den Seitenwechsel, beide Bildhälften aus BAR0 in den Adressraum des Aufrufers legen. Danach schreibt der Kernel nicht mehr auf den Bildschirm. Scheitert ein Schritt (kein VBE, kein BAR0, kein Platz für zwei Bilder), kommt -1 und der GOP/EFI-Weg bleibt in Kraft. |
| 107 | ''sys_vbe_flip'' | ''y'' | 0 | Sichtbaren Bereich auf Zeile ''y'' setzen — ein Registerschreibzugriff, kein Kopieren. Vollkopien schreiben in die unsichtbare Hälfte und wechseln erst danach. |
| 153 | ''sys_ramdisk_create'' | ''size_mb'' | disk_id (8–11) oder -1 | RAM-Disk allozieren (WP30). Ruft ''VfsRamdiskCreate(size_mb)'' auf. Gibt externe Disk-ID (4–7) zurück; -1 bei kein freier Slot oder OOM. |
| 154 | ''sys_ramdisk_fmt'' | ''disk_id'' | 0 oder -1 | RAM-Disk als FAT32 formatieren + als aktives Volume mounten (WP30). Ruft ''VfsRamdiskFmt(disk_id)'' auf. ''Fat32Format'' + ''VfsMountDisk(0, disk_id, 0)''. |
| 155 | ''sys_mkfs_iofs'' | ''disk_id'' | 0 oder -1 | Disk (0–7) als IOFS formatieren (WP01+WP09). Ruft ''VfsMkfsIofs(disk_id)'' → ''IofsMkfs(disk_id)'' auf. Schreibt Superblock (p0), Root-Node (p1), Slot A (p2–131), Slot B (p132–261, inaktiv), WAL (p262–325). |
| 156 | ''sys_iofs_mount'' | ''disk_id'' | 0 oder -1 | IOFS-Volume mounten (WP02): aktiven Checkpoint-Slot laden, Bitmap + LIP-Tabelle (128 KB, 65536×uint16) in RAM. |
| 157 | ''sys_iofs_read_lpid'' | ''lpid, user_buf'' | 0 oder -1 | 4096-Byte-Page via LPID lesen (WP02). LIP→page_idx→DiskRead. ''user_buf'' muss via ''mmap'' alloziert sein. |
| 158 | ''sys_iofs_write_lpid'' | ''lpid, user_buf'' | page_idx oder -1 | Neue Ocean-Page allozieren, vollständige Page aus ''user_buf'' schreiben, LIP aktualisieren, alte Page freigeben (WP02). |
| 159 | ''sys_iofs_new_page'' | ''type, flags, payload_uva, psize'' | LPID oder 0 | Freien LPID allozieren, Page-Header aufbauen, Payload kopieren, schreiben (WP02). ''psize'' ≤ 4032. |
| 160 | ''sys_iofs_free_lpid'' | ''lpid'' | 0 oder -1 | Physische Page freigeben + LIP-Eintrag löschen (WP02). LPID 1 (Root) ist geschützt. |
| 161 | ''sys_iofs_checkpoint'' | — | 0 oder -1 | Crash-atomarer Dual-Slot-Flip: Bitmap + LIP → inaktiver Slot, Header zuletzt (WP02). |
| 162 | ''sys_iofs_unmount'' | — | 0 oder -1 | Checkpoint falls dirty, LIP-Tabelle freigeben (WP02). |
| 163 | ''sys_iofs_lip_get'' | ''lpid'' | page_idx oder 0 | LPID→physischer page_idx (0 = nicht gemappt, WP02). |
| 164 | ''sys_iofs_info'' | ''out_buf_uva'' | 0 oder -1 | 64-Byte-Status füllen: ''[0]''=mounted, ''[8]''=free_pages, ''[16]''=mapped, ''[24]''=active_slot, ''[32]''=seq, ''[40]''=dirty (WP02). |
| 165 | ''sys_iofs_edge_add'' | ''from_lpid, to_lpid, edge_type'' | 0 oder -1 | Gerichtete Kante hinzufügen (WP05). Erstellt Edge-List-Page falls nötig; kettet neue Page an wenn voll (> 336 Einträge). |
| 166 | ''sys_iofs_edge_remove'' | ''from_lpid, to_lpid'' | 0 oder -1 | Erste Kante ''from→to'' entfernen, Einträge in-place kompaktieren (WP05). |
| 167 | ''sys_iofs_edge_count'' | ''from_lpid'' | Anzahl oder 0 | Anzahl ausgehender Kanten über die gesamte Edge-List-Page-Kette (WP05). |
| 168 | ''sys_iofs_edge_get_all'' | ''from_lpid, out_buf_uva, max_edges'' | Anzahl oder 0 | Kanten in Puffer lesen: 16 Bytes/Eintrag ([0-7]=to_lpid, [8-15]=edge_type, WP05). |
| 169 | ''sys_iofs_edge_has'' | ''from_lpid, to_lpid'' | 1 oder 0 | Kanten-Existenz prüfen (beliebiger ''edge_type'', WP05). |
| 170 | ''sys_iofs_bfs'' | ''start_lpid, out_buf_uva, max_nodes'' | Anzahl oder 0 | BFS-Traversal ab ''start_lpid''; out_buf = int64-Array besuchter LPIDs (WP06). |
| 171 | ''sys_iofs_dfs'' | ''start_lpid, out_buf_uva, max_nodes'' | Anzahl oder 0 | DFS-Traversal (iterativer Stack, WP06). |
| 172 | ''sys_iofs_reachable'' | ''from_lpid, to_lpid'' | 1 oder 0 | Prüft ob ''to_lpid'' von ''from_lpid'' aus erreichbar ist (BFS Early-Exit, WP06). |
| 173 | ''sys_iofs_shortest_path'' | ''from_lpid, to_lpid, path_buf_uva, max_len'' | Pfadlänge oder 0 | Kürzester Pfad (BFS + Parent-Array, WP06). 0 = nicht erreichbar oder Pfad > max_len. |
| 174 | ''sys_iofs_name_init'' | — | 0 oder -1 | Name-Store-Root auf LPID=2 initialisieren (idempotent, WP07). |
| 175 | ''sys_iofs_name_lookup'' | ''name_uva, name_len'' | LPID oder 0 | Name → LPID (0 = nicht gefunden, WP07). |
| 176 | ''sys_iofs_name_bind'' | ''name_uva, name_len, lpid'' | 0 oder -1 | Name an LPID binden; Update wenn Name schon existiert (WP07). |
| 177 | ''sys_iofs_name_unbind'' | ''name_uva, name_len'' | 0 oder -1 | Bindung entfernen; Left-Shift-Kompaktierung in-place (WP07). |
| 178 | ''sys_iofs_name_list'' | ''out_buf_uva, max_entries'' | Anzahl oder 0 | Alle Bindungen ausgeben, 80 Bytes/Eintrag: [0-7]=lpid, [8-15]=name_len, [16+]=name (WP07). |
| 179 | ''sys_iofs_gc'' | — | 0 oder -1 | Mark+Sweep-Garbage-Collection über den IOFS-Graphen; nicht erreichbare Pages freigeben (WP07-GC, ''IofsGC''). |
| 180 | ''sys_tcp_connect'' | ''dst_ip, dst_port'' | socket-fd oder -1 | TCP-Verbindung öffnen (WP16-TCP). 3-Way-Handshake; ''src_port = 1024 + slot''. Max. 8 gleichzeitige Verbindungen (''g_tcp_table''). Kernel: ''kernel/net.lyx''. |
| 181 | ''sys_tcp_send'' | ''fd, buf_phys, len'' | bytes_sent oder -1 | Daten als PSH+ACK-Segment senden (WP16-TCP). Nutzt ''g_tcp_txbuf'' (getrennt von ''g_net_buf''). |
| 182 | ''sys_tcp_recv'' | ''fd, buf_phys, len'' | bytes_recv oder -1 | Auf Daten-Paket warten, in Puffer kopieren, ACK senden (WP16-TCP). |
| 183 | ''sys_tcp_close'' | ''fd'' | 0 oder -1 | FIN-Handshake (FIN → FIN-ACK), Slot freigeben (WP16-TCP). |
| 184 | ''sys_tcp_status'' | ''fd'' | state-int | TCP-Verbindungszustand abfragen (WP16-TCP). |
| 200 | ''sys_spawn_async'' | ''path_uva'' | slot (0..1) oder -1 | ELF als **asynchrones** Kind laden und bis zum ersten sys_yield (nr=24) ausführen. Liefert Slot-Index. Max. 2 gleichzeitige async-Kinder. |
| 201 | ''sys_run_child'' | ''slot'' | 0 (yield) oder Exit-Code | Asynchrones Kind bis zum nächsten sys_yield oder Beendigung fortsetzen. 0 = Kind hat geyldet; >0 = Exit-Code. |
==== Ergänzt aus ''kernel/ring3.lyx'' (2026-08-02) ====
Diese Syscalls sind im Dispatcher vorhanden, waren in der Tabelle oben aber nicht aufgeführt. Beschreibungen stammen aus den Quellkommentaren.
^ Nr ^ Name ^ Argumente ^ Rückgabe ^ Beschreibung ^
| 8 | ''sys_lseek'' | ''fd, offset, whence'' | — | a0=fd, a1=offset, a2=whence |
| 148 | ''sys_win_set_title'' | ''win_id, title_uva'' | — | copy title string into win slot (WP27) |
| 149 | ''sys_win_find_by_idx'' | ''n'' | — | win_id of n-th active window sorted ascending by creation order (WP27) |
| 185 | ''sys_mkfs_iofs_part'' | ''disk_id, part_no'' | — | format partition #part_no as IOFS (WP31) |
| 186 | ''sys_iofs_mount_part'' | ''disk_id, part_no'' | — | mount IOFS from a partition (WP31) |
| 187 | ''sys_mount_part_auto'' | ''vol_id, disk_id, part_no'' | — | auto-detect FS + mount (WP31) |
| 188 | ''sys_probe_fs_part'' | ''disk_id, part_no'' | — | → 1 = IOFS, 0 = FAT32/other, -1 = none (WP31) |
| 202 | ''sys_proc_info'' | ''slot=a0, out_uva=a1'' | — | per-slot process info for `top` |
| 203 | ''sys_mem_stats'' | ''out_uva=a0'' | — | +0=free_pages +8=total_pages +16=pit_frame +24=busy_ticks +32=bump_used +40=bump_total. **Puffer 64 Byte**, nicht 24 — der Kernel schreibt bis +40 |
| 205 | ''sys_cpu_stats'' | ''out'' | — | → ncpu + per-core (busy, total) ticks (TO-9.5). Mirrors the |
| 210 | ''sys_power'' | ''action=a0'' | — | 0 = reboot, 1 = shutdown. Does not return |
| 230 | ''sys_map_device'' | ''phys, size'' | — | DRV-3: Geräteregister in den eigenen Adressraum abbilden; ≤ 16 MB, nichts unterhalb 160 MB → [[lyxos:treiber|Treibermodell]] |
| 232 | ''sys_pci_cfg_read'' | ''bdf, reg'' | — | DRV-3: PCI-Konfiguration lesen |
| 233 | ''sys_pci_cfg_write'' | ''bdf, reg, val'' | — | DRV-3: PCI-Konfiguration schreiben |
| 234 | ''sys_dma_alloc'' | ''size'' | — | DRV-4: DMA-Puffer anfordern → Kennung |
| 235 | ''sys_dma_addr'' | ''id'' | — | DRV-4: abgebildete Adresse des Puffers |
| 236 | ''sys_dma_program'' | ''id, mmio, offset, width'' | — | DRV-4: der **Kernel** trägt die physische Adresse ins Geräteregister ein |
| 237 | ''sys_notify_create'' | — | — | DRV-5: Benachrichtigungsschlange anlegen (keine Flags) |
| 238 | ''sys_notify_post'' | ''id'' | — | DRV-5: melden (keine Nutzlast) |
| 239 | ''sys_notify_wait'' | ''id'' | — | DRV-5: blockierend warten (keine Frist); nur im Scheduler-Pfad |
| 240 | ''sys_irq_bind'' | ''bdf, notify_id'' | — | DRV-5: Geräte-Interrupt auf die Schlange legen |
| 241 | ''sys_hid_claim'' | ''slot, notify_id'' | — | DRV-6: HID-Gerät übernehmen |
| 242 | ''sys_hid_release'' | ''slot'' | — | DRV-6: wieder freigeben |
| 243 | ''sys_usb_dev_count'' | — | — | DRV-6: Zahl der enumerierten USB-Geräte |
| 244 | ''sys_usb_dev_info'' | ''idx, out_uva'' | — | DRV-6: ein USB-Gerät |
| 245 | ''sys_hid_claim_dma'' | ''slot, notify_id, dma_id'' | — | DRV-6: übernehmen mit eigenem DMA-Puffer |
| 246 | ''sys_input_key'' | ''ascii'' | — | DRV-6: Taste an den Kernel zurückmelden |
| 247 | ''sys_input_mouse'' | ''dx, dy, btn'' | — | DRV-6: Mausbewegung zurückmelden |
| 248 | ''sys_i2c_xfer'' | ''a0, wbuf, lens, rbuf'' | — | I²C-Übertragung; Grundlage des Ring-3-Treibers ''i2chid'' |
| 249 | ''sys_i2c_hid_info'' | ''idx, out_uva'' | — | ein von ACPI genanntes I²C-HID-Gerät |
| 250 | ''sys_i2c_hid_count'' | — | — | Zahl dieser Geräte |
| 251 | ''sys_devinfo_count'' | — | — | Zahl der Einträge im [[lyxos:geraeteverzeichnis|Geräte-Verzeichnis]] (für ''sysinfo'') |
| 252 | ''sys_devinfo_get'' | ''idx, out_uva'' | — | ein Eintrag, 48 Byte: ''kind''(+0), ''v0''…''v3''(+8/+16/+24/+32), Name(+40) — [[lyxos:geraeteverzeichnis|Aufbau]] |
| 253 | ''sys_cpu_ident'' | ''out_uva'' | — | Hersteller und Modellbezeichnung aus CPUID |
| 211 | ''sys_net_get_info'' | ''uva_buf'' | — | fill 112-byte interface info struct |
| 212 | ''sys_net_set'' | ''field=a0, val=a1'' | — | configure one interface field |
| 213 | ''sys_icmp_ping'' | ''buf'' | — | ICMP echo round-trip; buf carries params in/results out |
| 214 | ''sys_dns_query'' | ''buf, name_uva'' | — | DNS lookup; buf params/results, a1=name string |
| 215 | ''sys_launch_request'' | ''path'' | — | copy the path (user-virtual or physical literal, |
| 217 | ''sys_spawn_queued'' | ''—'' | — | if a launch is pending, spawn g_launch_path as an async |
| 218 | ''sys_event_recv_timeout'' | ''pid_idx=a0, out_buf=a1, timeout_ms=a2'' | — | — |
| 219 | ''sys_audio_play'' | ''uva=a0, nbytes=a1, rate=a2'' | — | copy user PCM (16-bit |
| 220 | ''sys_audio_tone'' | ''freq=a0, amp=a1, ms=a2'' | — | kernel-generated tone |
| 221 | ''sys_audio_status'' | ''—'' | — | 1 if an audio device is present, else 0 |
| 222 | ''sys_audio_stream_start'' | ''chunk_frames=a0'' | — | init the BDL-ring stream |
| 223 | ''sys_audio_stream_queue'' | ''uva=a0, nframes=a1'' | — | non-blocking — if the ring |
| 224 | ''sys_audio_stream_busy'' | ''—'' | — | 1 if the ring is full (caller may yield) |
| 225 | ''sys_mp3_offload_start'' | ''—'' | — | load the mp3 + tables (BSP), spawn the decoder as a |
| 226 | ''sys_mp3_offload_pump'' | ''—'' | — | drain decoded frames from the ring to AC97 (BSP-side, |
| 227 | ''sys_spawn_async'' | ''path_uva=a0'' | — | load ELF into first free async slot, run to first SysYield |
| 2063 | ''sys_graph_node_create'' | ''label_uva, type'' | — | → node_id or -1 |
| 2064 | ''sys_graph_edge_add'' | ''from_id, to_id, rel_type'' | — | → edge_id or -1 |
| 2065 | ''sys_graph_edge_remove'' | ''edge_id'' | — | → 0/-1 |
| 2066 | ''sys_graph_query'' | ''start_id, depth, out_uva, out_max'' | — | → count |
| 2315 | ''sys_timeline_query'' | ''t_start, t_end, out_uva, out_max'' | — | → count |
==== SHM-Ringpuffer-Format ====
Für ''sys_set_console'' und ''sys_set_child_out'' gilt:
+0: write_pos (int64) — nächste Schreibposition mod 4080
+8: (reserviert, 8 Byte)
+16: data[4080] — Byte-Ringpuffer (rohe Zeichen-Ausgabe)
==== Async-Child-Slots ====
^ Slot ^ Physische Ladeadresse ^ PHYS-Konstante ^
| 0 | 0x1D00000 (29 MB) | ACHILD0_PHYS |
| 1 | 0x1E00000 (30 MB) | ACHILD1_PHYS |
Jeder Slot hat einen 64-Byte-Kontextblock (achild_ctx): ''{rsp(8), rcx(8), r11(8), rbp(8), cr3(8), heap_virt(8), status(8)}''. status: 0=frei, 1=aktiv, -1=beendet.
==== Abweichungen vom Future-ABI ====
^ Aspekt ^ Future-ABI (Abschnitte 1–7) ^ Implementierter ABI (aktuell) ^
| Fehlercodes | ''rax = ERR_*'' (35 Konstanten) | Nur -1 / ≥0, keine dedizierten Codes |
| Zwei-Register-Rückgabe | ''rax = Fehler'', ''rdx = Wert'' | Einzel-Register: result in rdx; rax immer 0 |
| Syscall-Nummernschema | 0x0000–0x0DFF (hex-Gruppen) | Flach: 0–201 |
| dir_fd / AT_CWD | Immer erstes Argument | Pfad-Syscalls ohne dir_fd — CWD implizit |
| FD-Offset | VFS-FD 0 = stdin direkt | Ring-3-FD = VFS-FD + 3 (fd 0–2 reserviert) |
| CLOEXEC-Default | CLOEXEC per Default | Keine FD-Vererbungs-Kontrolle implementiert |
| sys_mmap | Nr. 0x0100 | Nr. 9 |
----
Letzte Aktualisierung: 2026-08-29 — ''sys_vbe_takeover'' (106) und ''sys_vbe_flip'' (107) ergänzt: der Compositor übernimmt den Bildschirm selbst statt ihn vom UEFI zu erben. Beide Nummern stehen in **beiden** Dispatchern (''handle_r3_syscall'' und dem Scheduler-Pfad) — ein Syscall nur in einem von beiden fällt im preemptiven Fenster durch.
Vorherige Aktualisierung: 2026-08-28 — ''sys_disk_id_range'' (103) ergänzt: Werkzeuge erfragen die Nummernvergabe, statt sie abzuschreiben.
Vorherige Aktualisierung: 2026-08-27 — Nummern 230–247 (DRV-3 bis DRV-6: MMIO, PCI, DMA, Benachrichtigungen, HID) und 248–253 ergänzt (I²C und Geräte-Verzeichnis, Quelle ''kernel/ring3.lyx''); Pufferbeschreibung von ''sys_mem_stats'' auf 64 Byte richtiggestellt. Hinweis: die frühere 204 (''cpu_idle_tick'') wurde beim TO-8-Rückbau entfernt — Kernstatistik läuft über 205.
Vorherige Aktualisierung: 2026-06-20