- Fix P15-8-init-cycle-detection.patch: replace visiting+error with seen+silent-skip to eliminate 11 false-positive 'dependency cycle detected' errors on shared deps - Fix P0-daemon-fix-init-notify-unwrap.patch: remove eprintln! for missing INIT_NOTIFY (expected for oneshot_async services, ~7 daemons affected) - Fix driver-manager hotplug loop: add PERMANENTLY_SKIPPED static set shared between hotplug handler and DriverConfig::probe() to stop infinite re-probing of Fatal/NotSupported/deferred-exhausted device+driver pairs (e.g. ided) - Fix driver-manager log_timeline: suppress repeated EPIPE/ENOENT errors with AtomicI32 dedup and AtomicBool one-shot guards for boot timeline JSON - Add driver-manager SIGTERM handler, ACPI bus registration, --status mode, driver reap loop, graceful shutdown, and reduced deferred retries (30→3)
5.1 KiB
RECIPES/CORE — ESSENTIAL SYSTEM COMPONENTS
Kernel, bootloader, C library, init system, and base drivers. Everything needed to boot Redox.
STRUCTURE
recipes/core/
├── kernel/ # Redox microkernel (~20-40k LoC Rust)
│ └── source/ # Kernel source (fetched from gitlab.redox-os.org)
├── bootloader/ # UEFI bootloader (x86_64-uefi, aarch64-uefi)
│ └── source/mk/ # Per-arch bootloader build rules
├── relibc/ # POSIX C library written in Rust
│ └── source/ # relibc source (headers, platform, syscalls)
├── base/ # Core userland + all drivers
│ └── source/ # Base repo (audiod, ipcd, ptyd, drivers, netstack, ramfs)
│ └── drivers/ # ALL drivers (userspace daemons)
│ ├── graphics/ # vesad, virtio-gpud, ihdgd (Intel experimental)
│ ├── net/ # e1000d, rtl8168d, rtl8139d, ixgbed
│ ├── storage/ # ided, ahcid, nvmed, usbscsid
│ ├── audio/ # ac97d, ihdad, sb16d
│ ├── usb/ # usbhidd (USB HID)
│ ├── virtio/ # virtio-blkd, virtio-netd, virtio-gpud
│ └── pci/ # pcid, pcid-spawner (PCI enumeration)
├── installer/ # redox_installer (creates filesystem images)
├── redoxfs/ # RedoxFS (default filesystem)
├── init/ # Init system (TOML-based service manager)
├── ion/ # Ion shell (default)
├── userutils/ # Core user management
├── uutils/ # Coreutils (Rust port)
└── netutils/ # Basic network utilities
WHERE TO LOOK
| Task | Location |
|---|---|
| Fix kernel crash | kernel/source/src/ — syscall handling, context switching, memory mgmt |
| Add a syscall | kernel/source/src/scheme/ — scheme registration, then libredox binding |
| Fix a driver | base/source/drivers/<driver>/src/ |
| Fix POSIX compat | relibc/source/src/header/ — add missing POSIX headers/functions |
| Add bootloader support | bootloader/source/mk/<arch>-unknown-uefi.mk |
| Fix PCI enumeration | base/source/drivers/pci/pcid-spawner/ |
| Fix display output | base/source/drivers/graphics/ — vesad, virtio-gpud |
| Fix networking | base/source/drivers/net/ + base/source/netstack/ |
KERNEL SCHEME ARCHITECTURE
Kernel provides minimal schemes: debug, event, memory, pipe, irq, time, sys, proc, serio.
All other schemes are userspace daemons registering via File::create(":myscheme").
Driver access pattern:
1. iopl() syscall → port I/O privilege
2. Open /scheme/memory/physical → mmap hardware registers
3. Open /scheme/irq/{num} → receive interrupts as messages
4. Register scheme → handle requests from user programs
DRIVER MODEL
- ALL drivers are userspace daemons (except serio for PS/2)
- Access hardware via:
scheme:memory,scheme:irq,ioplsyscall - Register as scheme: daemon name becomes
/scheme/<name> - PCI devices discovered via
pciddaemon → spawns drivers
HISTORICAL POSIX GAPS IN RELIBC (Wayland-facing)
| Missing API | Location to implement |
|---|---|
| signalfd/signalfd4 | relibc/source/src/header/signal/ + active local/patches/relibc/P3-signalfd*.patch carriers — current support is recipe-applied, not plain-source convergence |
| timerfd_create/settime/gettime | relibc/source/src/header/sys_timerfd/ + active local/patches/relibc/P3-timerfd-relative.patch carrier — current support is recipe-applied |
| eventfd | relibc/source/src/header/sys_eventfd/ + active local/patches/relibc/P3-eventfd-mod.patch carrier — current support is recipe-applied |
| F_DUPFD_CLOEXEC | relibc/source/src/header/fcntl/ + local/patches/relibc/redox.patch — support language should remain evidence-qualified |
| MSG_CMSG_CLOEXEC, MSG_NOSIGNAL | relibc/source/src/header/sys_socket/ — support language should remain evidence-qualified |
| open_memstream | relibc/source/src/header/stdio/ + local/patches/relibc/P3-open-memstream.patch carrier — current support is patch-carried |
The current relibc work is therefore no longer just “add the missing Wayland APIs.” The higher-value remaining work is completeness depth, downstream cleanup, and runtime validation.
ANTI-PATTERNS
- DO NOT add drivers to kernel — all drivers must be userspace
- DO NOT modify syscall ABI — use libredox/relibc wrappers
- DO NOT use unwrap() in drivers — handle errors properly with Result
CASCADE REBUILDS
Core packages (relibc, kernel, base) are at the bottom of the dependency tree. When any of them changes, all dependent packages must be rebuilt:
./local/scripts/rebuild-cascade.sh relibc # Rebuilds relibc + all downstream
./local/scripts/rebuild-cascade.sh kernel # Rebuilds kernel + all downstream
./local/scripts/rebuild-cascade.sh base # Rebuilds base + all downstream
relibc in particular has the widest cascade: any change to its headers or ABI affects every C package in the tree (bison, m4, flex, ncurses, and transitively everything that depends on those).