OpenProninx Handbook
This handbook documents the Core 0.1.6-dev system, its commands, and its public userspace interface.
Starting a session
Boot the QEMU image with bmake qemu (BIOS) or ./run-uefi.sh (UEFI). The system launches PSH across 4 Virtual Terminals (switch between them using CTRL + ALT + F1..F4).
ls pwd cat /fnusvc.status top fnufetch status services health
Accounts
Create an account locally with adduser NAME; add -w to place that account in wheel. The password is read from the console and must be at least eight characters. These account tools are not a complete access-control model; do not rely on them for security isolation.
Services & Init
OpenProninx features a SysVinit-style init (PID 1) and fnusvc supervisor. fnusvc spawns a login session on each active virtual terminal (/dev/tty1..4) and manages system services such as fnu-health. On shutdown, init performs clean process teardown (via SIGTERM/SIGKILL death ladders) and executes poweroff or reboot through halt(2).
Application binary interface (ABI)
OpenProninx uses a native x86-64 system-call ABI. User programs enter the kernel with int $0x30. Put the system-call number in RAX; pass up to six arguments in RDI, RSI, RDX, RCX, R8, and R9, in that order. The kernel returns the result in RAX. An unknown or unavailable system call returns -1.
The Stable Core ABI covers 60 system calls with frozen numbers and signatures (syscalls 0–45, 48, 52–64). Syscalls 46–47 and 49–51 (in-kernel auth) are Experimental. The total syscall count is 65 (PRONINX_SYSCALL_COUNT). The public userspace declarations are in user/user.h; the full reference is in doc/ABI.md.
| Number | System call | Interface range |
|---|---|---|
| 0 | exit | Stable Core ABI |
| 1 | read | Stable Core ABI |
| 2 | write | Stable Core ABI |
| 3 | open | Stable Core ABI |
| 4 | close | Stable Core ABI |
| 5 | fork | Stable Core ABI |
| 6 | wait | Stable Core ABI |
| 7 | kill | Stable Core ABI |
| 8 | exec | Stable Core ABI |
| 9 | sbrk | Stable Core ABI |
| 10 | malloc | Stable Core ABI |
| 11 | free | Stable Core ABI |
| 12 | stat | Stable Core ABI |
| 13 | pipe | Stable Core ABI |
| 14 | info | Stable Core ABI |
| 15 | reboot | Stable Core ABI |
| 16 | procinfo | Stable Core ABI |
| 17 | ioctl | Stable Core ABI |
| 18 | getdents | Stable Core ABI |
| 19 | link | Stable Core ABI |
| 20 | mkdir | Stable Core ABI |
| 21 | unlink | Stable Core ABI |
| 22 | dup | Stable Core ABI |
| 23 | mknod | Stable Core ABI |
| 24 | chdir | Stable Core ABI |
| 25 | getpid | Stable Core ABI |
| 26 | sleep | Stable Core ABI |
| 27 | waitpid | Stable Core ABI |
| 28 | ping | Stable Core ABI |
| 29 | udp_open | Stable Core ABI |
| 30 | udp_bind | Stable Core ABI |
| 31 | udp_sendto | Stable Core ABI |
| 32 | udp_recvfrom | Stable Core ABI |
| 33 | udp_close | Stable Core ABI |
| 34 | netinfo | Stable Core ABI |
| 35 | netconfig | Stable Core ABI |
| 36 | tcp_open | Stable Core ABI |
| 37 | tcp_bind | Stable Core ABI |
| 38 | tcp_listen | Stable Core ABI |
| 39 | tcp_accept | Stable Core ABI |
| 40 | tcp_connect | Stable Core ABI |
| 41 | tcp_send | Stable Core ABI |
| 42 | tcp_recv | Stable Core ABI |
| 43 | tcp_close | Stable Core ABI |
| 44 | dns_resolve | Stable Core ABI |
| 45 | getuid | Stable Core ABI |
| 46 | login | Experimental |
| 47 | doas_auth | Experimental |
| 48 | setuid | Stable Core ABI |
| 49 | useradd | Experimental |
| 50 | passwd | Experimental |
| 51 | users | Experimental |
| 52 | setforeground | Stable Core ABI |
| 53 | chmod | Stable Core ABI |
| 54 | chown | Stable Core ABI |
| 55 | poweroff | Stable Core ABI |
| 56 | rtctime | Stable Core ABI |
| 57 | df | Stable Core ABI |
| 58 | signal | Stable Core ABI |
| 59 | sigcatch | Stable Core ABI |
| 60 | sigwait | Stable Core ABI |
| 61 | halt | Stable Core ABI |
| 62 | hwinfo | Stable Core ABI |
| 63 | diskinfo | Stable Core ABI |
| 64 | getcwd | Stable Core ABI |
ABI data types and structures
The public ABI header uses 64-bit pointer_t and uint64, 32-bit uint32, 8-bit uint8 and proc_state_t; pid_t is a signed 32-bit type. It publishes struct info for uptime, RAM, and process count; struct procinfo for process snapshots; struct hwinfo for CPU/VRAM/PCI hardware inventory; struct diskinfo for attached block storage info (AHCI SATA / NVMe / RAMDisk); struct fb_modelist for display modes; network structures (struct network_status, struct network_ipv4_config, struct network_ping_request, struct network_endpoint, struct network_dns_request); struct rtctime for RTC wall-clock time; struct df_stat for storage usage; struct linux_dirent64 for directory enumeration; and struct termios / struct fb_var_screeninfo for terminal and display control.
Process observation, signals, and waiting
procinfo(struct procinfo *records, int capacity) returns a bounded process snapshot for tools such as top. waitpid(pid, WNOHANG) supports a bounded non-blocking wait; use -1 as the PID to select any direct child. signal(2), sigcatch(2), and sigwait(2) implement signal handling and asynchronous event interception. kill(2) enforces permission isolation (only root/wheel may signal foreign processes).
Build note: Build userspace against the OpenProninx public headers: inc/abi.h, inc/syscall.h, inc/signal.h, and user/user.h.
UFS2 data volume & GPT Storage
The boot image PRONINX.img is a self-contained hybrid GPT disk containing an ESP partition (with kernel, ramdisk, and UEFI loader), an fnu-boot BIOS stage2 partition, and an fnu-root partition. When a prepared UFS2 FNU Data image is additionally attached, its namespace appears at /data.