OpenProninx Handbook

This handbook documents the Core 0.1.0-dev system, its commands, and its public userspace interface.

Starting a session

Boot the QEMU image with bmake qemu. The system launches PSH on the local console.

ls
cat /fnusvc.status
top
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

fnusvc is a small local supervisor. It publishes a service snapshot through /fnusvc.status. Its registered health service may be started, stopped, or restarted through PSH. A service that exits more than three times in one supervisor lifetime is marked failed and is not restarted automatically. If fnusvc exits, PID 1 reboots.

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 primary system-call range is numbered 0 through 24 and includes process control, file I/O, memory allocation, status, directory, terminal, and filesystem operations. The public userspace declarations are in user/user.h; the syscall numbers are in inc/syscall.h.

NumberSystem callInterface range
0exitBase ABI
1readBase ABI
2writeBase ABI
3openBase ABI
4closeBase ABI
5forkBase ABI
6waitBase ABI
7killBase ABI
8execBase ABI
9sbrkBase ABI
10mallocBase ABI
11freeBase ABI
12statBase ABI
13pipeBase ABI
14infoBase ABI
15rebootBase ABI
16procinfoBase ABI
17ioctlBase ABI
18getdentsBase ABI
19linkBase ABI
20mkdirBase ABI
21unlinkBase ABI
22dupBase ABI
23mknodBase ABI
24chdirBase ABI
25getpidExtended ABI (Non-ABI)
26sleepExtended ABI (Non-ABI)
27waitpidExtended ABI (Non-ABI)
28pingExtended ABI (Non-ABI)
29udp_openExtended ABI (Non-ABI)
30udp_bindExtended ABI (Non-ABI)
31udp_sendtoExtended ABI (Non-ABI)
32udp_recvfromExtended ABI (Non-ABI)
33udp_closeExtended ABI (Non-ABI)
34netinfoExtended ABI (Non-ABI)
35netconfigExtended ABI (Non-ABI)
36tcp_openExtended ABI (Non-ABI)
37tcp_bindExtended ABI (Non-ABI)
38tcp_listenExtended ABI (Non-ABI)
39tcp_acceptExtended ABI (Non-ABI)
40tcp_connectExtended ABI (Non-ABI)
41tcp_sendExtended ABI (Non-ABI)
42tcp_recvExtended ABI (Non-ABI)
43tcp_closeExtended ABI (Non-ABI)
44dns_resolveExtended ABI (Non-ABI)
45getuidExtended ABI (Non-ABI)
46loginExtended ABI (Non-ABI)
47doas_authExtended ABI (Non-ABI)
48setuidExtended ABI (Non-ABI)
49useraddExtended ABI (Non-ABI)
50passwdExtended ABI (Non-ABI)
51usersExtended ABI (Non-ABI)
52setforegroundExtended ABI (Non-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 user_info, network request/status structures, struct linux_dirent64 for directory enumeration, and struct termios for terminal control.

Process observation 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. It returns 0 immediately when matching children are still running.

Build note: Build userspace against the OpenProninx public headers: inc/abi.h, inc/syscall.h, and user/user.h.

UFS2 data volume

When a valid prepared UFS2 FNU Data image is attached, its namespace appears at /data. The writer supports file and empty-directory creation, direct-block writes, hard links, removal, and one level of indirect UFS2 blocks. Symlinks, double/triple indirection, and crash-safe metadata updates are not available. There is no FNU mkfs.