====== 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("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=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) und TCP-Stack (WP16-TCP, nr 180–184; siehe [[lyxos:tcp|TCP-Stack]]).
==== 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 | ''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_init'' | — | 0 oder -1 | E1000-NIC initialisieren: PCI-Erkennung, MMIO, TX/RX-Ring (WP26, ''NetInit''). Kernel: ''kernel/e1000.lyx''. |
| 142 | ''sys_net_send_raw'' | ''buf_uva, len'' | Bytes oder -1 | Rohen Ethernet-Frame senden (WP26, ''NetSendRaw''). |
| 143 | ''sys_net_recv_raw'' | ''buf_uva, len'' | Bytes oder -1 | Rohen Ethernet-Frame empfangen (WP26, ''NetRecvRaw''). |
| 144 | ''sys_net_dhcp_request'' | — | 0 oder -1 | DHCP-Lease anfordern; in QEMU user-mode → ''10.0.2.15'' (WP26, ''NetDhcpRequest''). |
| 145 | ''sys_net_get_ip'' | — | IPv4 (uint32) | Aktuelle IP-Adresse abfragen (WP26, ''NetGetIP''). |
| 146 | ''sys_net_arp_resolve'' | ''ip'' | MAC oder -1 | ARP: IP → MAC auflösen; QEMU routet alles über Gateway ''10.0.2.2'' (WP26, ''NetArpResolve''). |
| 147 | ''sys_net_get_mac'' | ''buf_uva'' | 0 | Eigene MAC-Adresse (6 Byte) in Puffer schreiben (WP26, ''NetGetMac''). |
| 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). |
| 153 | ''sys_ramdisk_create'' | ''size_mb'' | disk_id (4–7) 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_rm'' | ''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. |
==== 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-06-20