OpenProninx Handbook
This handbook documents the Core 0.1.6-dev system, its commands, and its public userspace interface.
What is FNU/OpenProninx?
FNU/OpenProninx is a free operating system based on PRONINX, created by the Foundry Technologies Collective. It is distributed under the BSD-3-Clause license and contains NOT A SINGLE LINE of GPL-licensed code.
How to build
To compile OpenProninx, you need to install the following tools: bmake, clang, lld, gdisk (sgdisk), mtools, clang-format, gdb (if you need debugging), and llvm. Here are the available targets:
bmake - builds PRONINX.img bmake ci - build + verify that the images aren't empty + smoke test bmake qemu - runs in QEMU with BIOS, GTK display, and the -serial mon:stdio argument bmake qemu-uefi - same thing, but with UEFI bmake smoke - runs the tests bmake system-image (si) - builds obj/fnu-system.ufs via tools/build-ufs2-system.sh (requires makefs with FFS/UFS2 support, FreeBSD only) bmake format - runs clang-format over boot/ kern/ inc/ lib/ user/ (doesn't touch vendored third_party/; skips files with CRLF/mixed EOL) bmake clean - removes obj/, .gdbinit, qemu.log, and the generated kern/vectors.S bmake qemu-gdb + bmake gdb - QEMU with the -gdb tcp::12345 -S argument and GDB with auto-connectMost of the time you'll only need bmake, bmake ci, and bmake qemu. To compile using multiple threads, pass -jy where y is the number of threads on your CPU.
Starting a session in QEMU
Boot the QEMU image with bmake qemu (BIOS) or ./run-uefi.sh (UEFI).
Starting a session in real PC
To launch FNU/OpenProninx on a physical computer, you must burn the .img image of FNU/OpenProninx to a storage medium (CD, DVD, USB) using either RUFUS or the dd utility in UNIX-based operating systems.
Support is available for both traditional BIOS and UEFI. Then, you need to choose your storage device in the Boot Menu on your computer. After that, you will be prompted to enter the password for one of the default users: root, user, or admin.
How to create account?
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.