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-connect
	
Most 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
0exitStable Core ABI
1readStable Core ABI
2writeStable Core ABI
3openStable Core ABI
4closeStable Core ABI
5forkStable Core ABI
6waitStable Core ABI
7killStable Core ABI
8execStable Core ABI
9sbrkStable Core ABI
10mallocStable Core ABI
11freeStable Core ABI
12statStable Core ABI
13pipeStable Core ABI
14infoStable Core ABI
15rebootStable Core ABI
16procinfoStable Core ABI
17ioctlStable Core ABI
18getdentsStable Core ABI
19linkStable Core ABI
20mkdirStable Core ABI
21unlinkStable Core ABI
22dupStable Core ABI
23mknodStable Core ABI
24chdirStable Core ABI
25getpidStable Core ABI
26sleepStable Core ABI
27waitpidStable Core ABI
28pingStable Core ABI
29udp_openStable Core ABI
30udp_bindStable Core ABI
31udp_sendtoStable Core ABI
32udp_recvfromStable Core ABI
33udp_closeStable Core ABI
34netinfoStable Core ABI
35netconfigStable Core ABI
36tcp_openStable Core ABI
37tcp_bindStable Core ABI
38tcp_listenStable Core ABI
39tcp_acceptStable Core ABI
40tcp_connectStable Core ABI
41tcp_sendStable Core ABI
42tcp_recvStable Core ABI
43tcp_closeStable Core ABI
44dns_resolveStable Core ABI
45getuidStable Core ABI
46loginExperimental
47doas_authExperimental
48setuidStable Core ABI
49useraddExperimental
50passwdExperimental
51usersExperimental
52setforegroundStable Core ABI
53chmodStable Core ABI
54chownStable Core ABI
55poweroffStable Core ABI
56rtctimeStable Core ABI
57dfStable Core ABI
58signalStable Core ABI
59sigcatchStable Core ABI
60sigwaitStable Core ABI
61haltStable Core ABI
62hwinfoStable Core ABI
63diskinfoStable Core ABI
64getcwdStable 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.